非常基本的问题。如何修改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();
}
}
答案 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就可以完成这项工作。