修改 Linq 结果

本文关键字:结果 Linq 修改 | 更新日期: 2023-09-27 18:33:43

非常基本的问题。 如何修改 Linq 结果?

为了进一步说明,我从数据库的订单表中选择一个订单列表。 我需要在 Web 窗体上的网格视图中显示结果。 首先,我需要修改一些结果。 例如,当"订单"字段具有值时,"报价"字段应更改为空白。 我可能需要对结果进行更精细的操作。 在过去,可以遍历数组并修改它们,但今天的编程似乎不希望循环发生。 目前,结果似乎是只读的,就好像我需要修改列表而做错了什么。

protected void fillGridView()
{
    using (CqsDataDataContext cqsDC = new CqsDataDataContext())
    {
        var orderlist = from x in cqsDC.MasterQuoteRecs
                        where x.CustomerNumber == accountNumber && x.DateCreated > DateTime.Now.AddDays(howfar)
                        orderby x.DateCreated descending
                        select new
                        {
                            customer = x.customername,
                            order = x.OrderReserveNumber,
                            quote = x.Quote,
                            date = Convert.ToDateTime(x.DateCreated).ToShortDateString(),
                            project = x.ProjectName,
                            total = x.Cost,
                            status = x.QuoteStatus
                        };

        // I would like to loop thru list and make changes to it here
        GridView1.DataSource = orderlist;
        GridView1.DataBind();
    }
}

修改 Linq 结果

最终会得到当前查询的IQueryable<anonymoustype>。由于它们是匿名类型,因此它们是只读的,无论如何都无法更改。

最好的选择是改用类,尤其是在打算进行数据库无法在查询中完成的更复杂的操作时。您还需要在查询末尾添加一个ToList(),以便最终得到一个List<YourClass>,然后可以像往常一样循环访问它并更改对象。

因此,创建一个包含所有属性的类,例如 MasterQuote ,并在查询中使用它:

var query = from x in cqsDC.MasterQuoteRecs
                where x.CustomerNumber == accountNumber && x.DateCreated > DateTime.Now.AddDays(howfar)
                orderby x.DateCreated descending
                select new MasterQuote
                {
                    Customer = x.customername,
                    Order = x.OrderReserveNumber,
                    Quote = x.Quote,
                    Date = Convert.ToDateTime(x.DateCreated).ToShortDateString(),
                    Project = x.ProjectName,
                    Total = x.Cost,
                    Status = x.QuoteStatus
                };
var orderList = query.ToList();
foreach (var item in orderList)
{
    if (item.OrderReserveNumber > 0)
    {
        item.Quote = "";
    }
}

您的MasterQuote类如下所示:

public class MasterQuote
{
    public string Customer { get; set; }
    public int Order { get; set; }
    // and so on
}

当然,对于您给出的示例,您可能会像 seth 提到的那样在查询中完成报价操作。

只需使用三元运算符。

select new
{
    customer = x.customername,
    order = x.OrderReserveNumber,
    quote = x.OrderReserveNumber != null ? string.Empty : x.Quote,
    date = Convert.ToDateTime(x.DateCreated).ToShortDateString(),
    project = x.ProjectName,
    total = x.Cost,
    status = x.QuoteStatus
};

取决于更改的实际复杂程度,但是您提到的更改可以通过静态类上的简单方法完成。

你们可以只是将 linq 语句链接在一起,并对引号列执行等效的 sql 大小写。

OrderList 似乎不太可能不实现 IEnumerable,所以如果所有的 linq 都变得太乱了,每个都会完成这项工作。