首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linq查询花费的时间太长

Linq查询花费的时间太长
EN

Stack Overflow用户
提问于 2011-08-25 18:16:17
回答 4查看 3.1K关注 0票数 6

我想知道有没有人能帮我一下。我有一个LINQ查询--没有问题,但返回数据的时间太长了

代码语言:javascript
运行
复制
var result = Context.paf_wgs84.Where(c => c.Postcode.Contains(postcode)).Take(15);

非常简单,当用户使用AJAX输入时,它返回一组15个可能的匹配项。

问题是,有160万条记录

在management studio中运行以下代码大约需要3秒钟。

代码语言:javascript
运行
复制
SELECT   code
FROM     paf_wgs84
WHERE    (code LIKE '%EC1%')

其中,运行以下代码所需时间不到一秒

代码语言:javascript
运行
复制
SELECT   TOP 15  code
FROM     paf_wgs84
WHERE    (code LIKE '%EC1%')

有没有一种不用.take()就能在LINQ中做类似事情的方法呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-25 18:30:43

你可以试试这样的东西。这将只返回一列。

代码语言:javascript
运行
复制
var result = Context.paf_wgs84.Where(c => c.Postcode.Contains(postcode)).Select(x=>new {x.Postcode}).Take(15);

生成的Sql语句将如下所示。

代码语言:javascript
运行
复制
/*
-- Region Parameters
DECLARE @p0 VarChar(1000) = '%s%'
-- EndRegion
SELECT TOP (15) [t0].[code]
FROM [paf_wgs84] AS [t0]
WHERE [t0].[code] LIKE @p0
*/
票数 3
EN

Stack Overflow用户

发布于 2011-08-25 18:36:32

问题可能是statemnt中的contains方法没有被映射到sql中的like语句,而您最终将所有行都映射到sql中,然后在web层中执行contains搜索,而不是在数据库中执行相同的操作。

使用SqlMethods实现相同的目的..如下所示:

代码语言:javascript
运行
复制
SqlMethods.Like(c.Postcode, string.Format("%{0}%",postcode));

有时,您还可以使用字符串方法,如: String.StartsWith或String.Ends,但在这种情况下,您不能..

以%开头的类同样的子句很少是一个好主意-尤其是,它不能有效地利用任何索引。使用“全文搜索”可能会有更好的性能;但这不能通过LINQ直接获得

希望这对你的问题有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2011-08-25 19:09:50

我把语句改成了

代码语言:javascript
运行
复制
var result = Context.paf_wgs84.Where(c => c.Postcode.StartsWith(postcode)).Take(10).Select(c => c.Postcode).ToArray();

我使用foreach来添加字符串数组--我想这就是我浪费时间的地方!

不过,还是要感谢大家的帮助。

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

https://stackoverflow.com/questions/7188653

复制
相关文章

相似问题

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