首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq.帮我调一下这个!

Linq.帮我调一下这个!
EN

Stack Overflow用户
提问于 2010-04-30 04:36:46
回答 1查看 164关注 0票数 3

我有一个linq查询,它导致了一些超时问题。基本上,我有一个查询,它从一个包含大约500,000条记录的表中返回前100个结果。

下面是查询:

代码语言:javascript
复制
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 => 
        }
    }

奇怪的是,导致超时的是第一个linq查询。我认为,通过做一个'Take‘,我们不需要扫描所有500k的记录。然而,这肯定是正在发生的事情。我猜是为了找到“可搜索的”而加入的,导致了这个问题。我不能解除表格的正规化。所以我想知道是否有一种方法可以重写linq查询,让它更快地返回...或者我应该把这个查询写成一个存储过程(如果是这样的话,它可能是什么样子的)。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-30 04:42:56

首先,我要找出正在生成的查询(在LINQ to SQL中,您将在数据上下文上设置日志),然后在SQL Server Management Studio中对其进行分析。使用它,直到您找到足够快的东西(通过更改查询或添加索引),如果您必须更改查询,了解如何在LINQ中表示它。

我怀疑问题是你将OrderByTake结合在一起--这意味着它可能需要找出所有的结果,以便找出前100名应该是什么样子。是否对Code进行了索引?如果没有,请尝试对其进行索引-这可能会有所帮助,因为它允许服务器按照返回记录的顺序考虑记录,这样在找到100条记录后就可以停止。您也应该查看其他列的索引。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2740611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档