优化 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 &lt; m.Gross ? m.Tare : m.Gross,

Gross = m.Tare &lt; m.Gross ? m.Gross : m.Tare,

这在幕后是如何工作的,有没有更好的方法来完成它?我很高兴它有效,但并不完美。这会使用(使用默认过滤器)77 条记录填充网格,并且需要大约 3 秒......太长了!

有没有更好的方法来分配毛重/皮重?我需要进行与此处类似的检查,因为权重在数据库中的存储不明确。

【问题讨论】:

可能更适合:codereview.stackexchange.com 我会更关心where部分查询。 您是否尝试将这两行注释掉以查看查询是否加快? 您可以将m.RecordCreated.Value.Year == fromDate.Year &amp;&amp; m.RecordCreated.Value.Month == fromDate.Month &amp;&amp; m.RecordCreated.Value.Day == fromDate.Day 简化为m.RecordCreated.Value.Date == from.Date 澄清一下:是 LINQ to SQL 还是 LINQ to Entities? 【参考方案1】:

fromDatetoDate 不是每行变量;它们对于整个查询都是固定的,因此您可以在查询之前进行检查,而不是将该检查作为查询的一部分:

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 =&gt; new id = m.ID, //etc... ).Etc().Etc()?刚刚做到了……看起来这是一个巨大的进步!我对 LINQ 不是很熟悉,但我每天都越来越喜欢它。

以上是关于优化 LINQ 查询的主要内容,如果未能解决你的问题,请参考以下文章

优化 LINQ 查询所需的帮助

使用 LINQ 优化内存中慢查询列表以检索数据

这两个 LINQ 查询有啥区别以及如何正确优化它们?

使用 EF6 优化 LINQ 查询

xBIM 使用Linq 来优化查询

EF LINQ 查询性能优化