修改Linq结果

时间:2012-05-10 16:28:43

标签: c# linq

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

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

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

    }
}

3 个答案:

答案 0 :(得分:2)

您最后使用当前查询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 mentioned完成引用操作。

答案 1 :(得分: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
};

答案 2 :(得分:1)

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

你可以将linq语句链接在一起,并为quote列做相当于sql的情况。

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