dtr*_*ick 3 c# linq linq-to-sql
我有一个linq查询导致一些超时问题.基本上,我有一个查询返回一个有大约500,000条记录的表的前100个结果.
这是查询:
using (var dc = CreateContext())
{
var accounts = string.IsNullOrEmpty(searchText)
? dc.Genealogy_Accounts
.Where(a => a.Genealogy_AccountClass.Searchable)
.OrderByDescending(a => a.ID)
.Take(100)
: dc.Genealogy_Accounts
.Where(a => (a.Code.StartsWith(searchText)
|| a.Name.StartsWith(searchText))
&& a.Genealogy_AccountClass.Searchable)
.OrderBy(a => a.Code)
.Take(100);
return accounts.Select(a =>
}
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,它是导致超时的第一个linq查询.我认为通过"Take"我们不需要扫描所有500k的记录.但是,这必定是正在发生的事情.我猜测找到"可搜索"的联接正在引发这个问题.我无法对表进行非规范化...所以我想知道是否有办法重写linq查询以使其更快地返回...或者我是否应该将此查询写为存储过程(和如果是这样,它会是什么样子).谢谢.
Jon*_*eet 14
首先,我将找出正在生成的查询(在LINQ to SQL中,您将设置登录数据上下文),然后在SQL Server Management Studio中对其进行概要分析.在那里玩它,直到你找到足够快的东西(通过改变查询或添加索引),如果你不得不改变查询,找出如何在LINQ中表示.
我怀疑问题是,你结合OrderBy和Take-这意味着它可能需要找出所有以制定出前100看起来像它的结果.被Code编入索引?如果没有,尝试索引 - 它可能有助于服务器按照返回的顺序考虑记录,因此它可以在找到100条记录后停止.您也应该查看其他列的索引.