LINQ.帮我调整一下!

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中表示.

我怀疑问题是,你结合OrderByTake-这意味着它可能需要找出所有以制定出前100看起来像它的结果.被Code编入索引?如果没有,尝试索引 - 它可能有助于服务器按照返回的顺序考虑记录,因此它可以在找到100条记录后停止.您也应该查看其他列的索引.