【问题标题】:How can I optimise this LinQ query?如何优化此 LinQ 查询?
【发布时间】:2016-06-20 12:23:33
【问题描述】:
model.mTable = m_ctx.Shop
 .Where(t => t.CustomerID== model.mFilter.CustomerID)
 .Select(f => new GroupedData
  {
      iGroupID = f.iCustomerID,
      dtGroupDt = new DateTime(f.dtDate.Year, f.dtDate.Month, f.dtDate.Day, f.dtStartTime.Hours, f.dtStartTime.Minutes, f.dtStartTime.Seconds, f.dtStartTime.Milliseconds),
 })
 .OrderByDescending(f => f.dtGroupDt)
 .Take(2)
 .ToList();

Shop 是表,CustomerID 是表的主键,但是如果有很多数据,那么这个查询会给我超时异常。有没有办法优化这个查询?

【问题讨论】:

  • 是的。可能是如果他每天购买一些物品。确切地说,CustomerID 是一种虚拟的东西。如果我说我需要它来假设在 5 月 5 日 10 分钟后刷新的实时数据!
  • 如果您在选择之前下订单,它会改变什么吗?但是为什么每个日期时间部分都有一个列,而不是只有一个 dtGroupDt-datetime 类型的列?
  • 可能在Select之前使用OrderByDescending(t => t.dtDate).ThenBy(t => t.dtStartTime)会更快。
  • 我会按照 FrozenDeath 所说的去做,但我也会尝试抓取它生成的查询,看看是否可以围绕它建立索引。

标签: c# linq


【解决方案1】:

这里有 3 件事可以帮助您:

1) 如果可能,将 dtDatedtStartTime 合并到一个列中
2) 在dtDate 上创建一个索引(参见@TimothyStepansky cmets),然后
3) 重新排序您执行查询的方式(未经测试,语法可能不完全正确):

model.mTable = m_ctx.Shop
              .Where(t => t.CustomerID== model.mFilter.CustomerID)
              .OrderByDescending(t => t.dtDate)
              .ThenBy(t => t.dtStartTime)
              .Select(f => new GroupedData
              {
                  iGroupID = f.iCustomerID,
                  dtGroupDt = new DateTime(f.dtDate.Year, f.dtDate.Month, f.dtDate.Day, f.dtStartTime.Hours, f.dtStartTime.Minutes, f.dtStartTime.Seconds, f.dtStartTime.Milliseconds),
              })
              .Take(2)
              .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多