【问题标题】:Very slow LINQ with where statements带有 where 语句的 LINQ 非常慢
【发布时间】:2016-06-21 04:40:47
【问题描述】:

我有一个如下所示的 LINQ:

var something = db.Calculations
            .Where(x => x.CalculationDate.Date == justTheDate 
            && x.CalculationID == externalObject.CalculationID 
            && x.CalculationDate >= minDate 
            && x.CalculationDate <= maxDate).GroupBy(x => 
            (int)x.CalculationDate.TimeOfDay.TotalMinutes);

其中justTheDateminDatemaxDate(日期时间)和externalObject.CalculationID(字符串)都是作用域中的变量。

当我枚举它时(使用 something.Select(x=&gt;x.Last()).ToList() 之类的东西)大约需要 15 秒。有很多数据,但与生产中的预期数据并不接近。

无论如何让这个查询更快?

【问题讨论】:

  • 说到 EF,LINQ 不是问题——它只是一种枚举语法。问题是数据库。你那里有多少记录?考虑将索引应用于您的表。
  • 在其上运行.ToString() 以查看它生成的查询。您也许可以将其编入索引。
  • 听起来像是数据库的索引问题。
  • 还有你的 Calculations 模型有多大,如果你不想获取这个模型的所有属性,你可以使用 select 语句只获取你感兴趣的属性
  • 在你的作业中使用 .ToList()。否则某些东西是 IQueryable 并且您的 Select() 调用将导致多次往返数据库(因为 IQueryable 不保存结果,只是应该如何构建查询的信息)

标签: c# entity-framework linq


【解决方案1】:

您可以使用此代码获取生成的 SQL 查询:

var objectQuery = something as System.Data.Objects.ObjectQuery;
string strQuery = objectQuery.ToTraceString();

获取查询后,您可以直接在数据库上执行它。如果它再次变慢,您应该为您的 where 子句列创建一个适当的索引。

【讨论】:

  • 谢谢你,但我忘了补充这是为 UWP 准备的。我似乎没有 System.Data.Objects.ObjectQuery
  • @Tyress 您需要添加对 .NET 程序集 System.Data.Entity.dll 的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多