我需要一些帮助来优化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查询?
答案 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);