优化 LINQ 查询
Posted
技术标签:
【中文标题】优化 LINQ 查询【英文标题】:Optimize LINQ queries 【发布时间】:2013-12-29 17:44:48 【问题描述】:我想优化我的 LINQ 查询。
Orders = (from m in dataContext.SupplierOrdersViews
where (fromDate != toDate ?
m.RecordCreated >= fromDate && m.RecordCreated <= toDate :
(m.RecordCreated.Value.Year == fromDate.Year &&
m.RecordCreated.Value.Month == fromDate.Month &&
m.RecordCreated.Value.Day == fromDate.Day))
select new
id = m.ID,
RecordCreated = m.RecordCreated,
RecordDeleted = m.RecordDeleted,
Status = m.Status,
DepRunningNo = m.DepRunningNo,
Name = m.Name,
Address1 = m.Address1,
VehicleRegNo = m.VehicleRegNo,
ProductName = m.ProductName,
Tare = m.Tare < m.Gross ? m.Tare : m.Gross,
Gross = m.Tare < m.Gross ? m.Gross : m.Tare,
NetWeight = m.NetWeight,
NetPrice = m.NetPrice
).OrderBy(m => m.RecordCreated).ThenByDescending(m => m.Status != 2).ToList();
我认为问题出在以下几行:
Tare = m.Tare < m.Gross ? m.Tare : m.Gross,
Gross = m.Tare < m.Gross ? m.Gross : m.Tare,
这在幕后是如何工作的,有没有更好的方法来完成它?我很高兴它有效,但并不完美。这会使用(使用默认过滤器)77 条记录填充网格,并且需要大约 3 秒......太长了!
有没有更好的方法来分配毛重/皮重?我需要进行与此处类似的检查,因为权重在数据库中的存储不明确。
【问题讨论】:
可能更适合:codereview.stackexchange.com 我会更关心where
部分查询。
您是否尝试将这两行注释掉以查看查询是否加快?
您可以将m.RecordCreated.Value.Year == fromDate.Year && m.RecordCreated.Value.Month == fromDate.Month && m.RecordCreated.Value.Day == fromDate.Day
简化为m.RecordCreated.Value.Date == from.Date
。
澄清一下:是 LINQ to SQL 还是 LINQ to Entities?
【参考方案1】:
fromDate
和 toDate
不是每行变量;它们对于整个查询都是固定的,因此您可以在查询之前进行检查,而不是将该检查作为查询的一部分:
Expression<Func<SupplierOrders, bool>> filter;
if(fromDate != toDate)
filter = m => m.RecordCreated >= fromDate && m.RecordCreated <= toDate;
else
filter = m => (m.RecordCreated.Value.Year == fromDate.Year &&
m.RecordCreated.Value.Month == fromDate.Month &&
m.RecordCreated.Value.Day == fromDate.Day);
dataContext.SupplierOrdersViews.Where(filter)
//the rest of the query goes here
【讨论】:
那么转换为dataContext.SupplierOrdersViews.Where(filter).Select(m => new id = m.ID, //etc... ).Etc().Etc()
?刚刚做到了……看起来这是一个巨大的进步!我对 LINQ 不是很熟悉,但我每天都越来越喜欢它。以上是关于优化 LINQ 查询的主要内容,如果未能解决你的问题,请参考以下文章