2

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

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

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();

    }
}
4

3 回答 3

2

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

您最好的选择,特别是如果您打算进行数据库查询中无法完成的更复杂的操作,是使用类来代替。您还需要ToList()在查询末尾添加 a ,以便最终得到 a 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
}

当然,对于您给定的示例,您可能可以在查询中完成 Quote 操作,如seth 所述

于 2012-05-10T16:36:08.880 回答
1

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

您可以将 linq 语句链接在一起,并为引号列执行相当于 sql case 的操作。

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

于 2012-05-10T16:38:32.610 回答
1

只需使用三元运算符。

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
};
于 2012-05-10T16:32:53.187 回答