Linq查询耗时太长

本文关键字:查询 Linq | 更新日期: 2023-09-27 18:06:32

我想知道是否有人可以帮助我。我有一个LINQ查询-没有问题,但它需要太长时间来返回数据

var result = Context.paf_wgs84.Where(c => c.Postcode.Contains(postcode)).Take(15);

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

问题是,有160万条记录

在管理工作室中运行以下代码大约需要3秒

SELECT   code
FROM     paf_wgs84
WHERE    (code LIKE '%EC1%')

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

SELECT   TOP 15  code
FROM     paf_wgs84
WHERE    (code LIKE '%EC1%')

有没有一种方法可以在LINQ中做类似的事情而不使用.take() ?

Linq查询耗时太长

您可以尝试这样做。这将只返回一列。

var result = Context.paf_wgs84.Where(c => c.Postcode.Contains(postcode)).Select(x=>new {x.Postcode}).Take(15);

生成的Sql语句如下所示:

/*
-- Region Parameters
DECLARE @p0 VarChar(1000) = '%s%'
-- EndRegion
SELECT TOP (15) [t0].[code]
FROM [paf_wgs84] AS [t0]
WHERE [t0].[code] LIKE @p0
*/

问题可能是你的包含方法在语句中它没有被映射到sql中的类似语句,你最终得到所有行到sql,然后在你的web层做一个包含搜索,而不是在你的DB做同样的。

使用SqlMethods内容如下:

SqlMethods.Like(c.Postcode, string.Format("%{0}%",postcode));

有时也可以使用字符串方法,如:string。StartsWith或String。以but结尾

Also - LIKE子句以%开头很少是一个好主意-尤其是,它不能有效地利用任何索引。使用"全文搜索"可能会有更好的性能;但这不能通过LINQ

直接获得

我把语句改成

var result = Context.paf_wgs84.Where(c => c.Postcode.StartsWith(postcode)).Take(10).Select(c => c.Postcode).ToArray();

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

谢谢大家的帮助。

使用新的FETCH和OFFSET语句,这些类型的查询的性能在SQL Server 2012中得到了极大的提高(尽管到目前为止我还没有看到太多的基准测试数据…)。

问题是EF还没有利用这些新特性。

一个可能的解决方案是使用SQL Server 2012和写一个sproc与FETCH/OFFSET,然后使用EF目标。当然这不是一个短期的解决方案,但我想指出这个选项。