修改 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();
}
}
您
最终会得到当前查询的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 都变得太乱了,每个都会完成这项工作。