实体框架Linq查询速度很慢

时间:2015-05-04 16:06:46

标签: c# linq entity-framework

我需要一些帮助来优化c#中的linq查询。我有一个小应用程序,它使用实体框架,里面是一些代码,如:

using (var db = new MyEntities())
{
  System.Diagnostics.Debug.WriteLine("Start: " + DateTime.Now.ToString());
  var myData = from table1 in db.Table1
  join table2 in db.Table2 on table1.Key equals table2.Key
  // more joins from various tables
  where table1.Date > StartDate && table1.Date < EndDate
  select table1;
  System.Diagnostics.Debug.WriteLine("After myData: " + DateTime.Now.ToString());

  var count = myData.Count();
  System.Diagnostics.Debug.WriteLine("After Count(): " + DateTime.Now.ToString());
  var list = myData.ToList();
  foreach(var variable in list)
  {
    //do something;
  }
}
return 

在这些表中,大约有200,000行。问题是,即使Count()返回0,Count()大约需要10秒,如果有几千行,那么它需要很长时间(至少10分钟),然后我得到错误,该变量是空值。是否有某种技术可以帮助我优化linq查询?

1 个答案:

答案 0 :(得分:1)

我敢打赌,这不是EF或LINQ问题。您的数据库仍需要使用适当的索引构建。如果设置断点并检查intellitrace窗口,您将能够看到正在执行的实际查询。将该查询复制到SQL Server Management Studio中,并查看查询的执行方式。这可以为您提供有关如何设置索引以优化此查询的提示。无论何时加入,都可以减慢执行查询的速度。任何与索引不匹配的WHERE子句都会打开执行查询速度较慢的可能性。

注意:有数以千计的关于索引数据库的正确方法的书籍,因此请在执行此操作时小心。

注意2:使用秒表类,而不是DateTime.Now作为您的计时。你会得到更一致的结果。

var sw = Stopwatch.StartNew();
//do code
sw.Stop();
Debug.WriteLine(sw.Elapsed);