我怎样才能加快这些linq查询的速度?

时间:2016-03-09 18:42:01

标签: c# linq

我可以将以下两个linq查询合并为一个,以加快速度吗?

第一个,搜索并执行分页

 Products.Data = db.Products.Where(x =>  x.ProductCode.Contains(search) ||
                                         x.Name.Contains(search) || 
                                         x.Description.Contains(search) || 
                                         x.DescriptionExtra.Contains(search) ||
                                         SqlFunctions.StringConvert(x.Price).Contains(search) ||
                                         SqlFunctions.StringConvert(x.PriceOffer).Contains(search) ||
                                         SqlFunctions.StringConvert(x.FinalPrice).Contains(search) ||
                                         SqlFunctions.StringConvert(x.FinalPriceOffer).Contains(search))
                                         .OrderBy(p => p.ProductID)
                                         .Skip(PageSize * (page - 1))
                                         .Take(PageSize).ToList();

而第二个计算总过滤结果。

    int count = db.Products.Where(x => x.ProductCode.Contains(search) ||
                                       x.Name.Contains(search) ||
                                       x.Description.Contains(search) ||
                                       x.DescriptionExtra.Contains(search) ||
                                       SqlFunctions.StringConvert(x.Price).Contains(search) ||
                                       SqlFunctions.StringConvert(x.PriceOffer).Contains(search) ||
                                       SqlFunctions.StringConvert(x.FinalPrice).Contains(search) ||
                                       SqlFunctions.StringConvert(x.FinalPriceOffer).Contains(search))
                                      .Count();

3 个答案:

答案 0 :(得分:2)

摆脱那些荒谬无效的转换。

  

SqlFunctions.StringConvert(x.Price).Contains(search)||

无法使用索引,全表扫描以及转换 - 这一点很糟糕。

并确保你拥有所有指数。

你无能为力。

答案 1 :(得分:1)

停止使用'包含'功能导致它很慢(如果可以的话)

确保您的查询可以使用数据库中的索引。 如果你必须包含' - 看看SQL的全文搜索功能,但您可能需要更改这个纯sql或自定义Linq如何转换为SQL以使用全文索引

答案 2 :(得分:1)

我认为你不能直接组合它们。这是分页的一个问题 - 无论如何你需要知道结果的总数。动态分页的问题还在于,一个页面可能与另一个页面不一致,因为它来自不同的时间。因此,您可以很容易地完全错过项目。如果这可能是一个问题,我会避免动态分页。您可以将整个结果的id填充到服务器上的某个临时表中,然后从那里进行分页。或者您可以从全文搜索返回所有ID,并按需查询其余数据。

还有一些优化,当搜索字符串长度至少为3个字符时,您可以开始返回结果,或者您可以为此目的构建具有计数估计值的特殊表。您还可以决定,您只返回前十页并为ids(或ids的客户带宽)节省服务器存储空间。

我伤心看到"停止使用含有"没有替代的答案。在单词中间搜索是必须的很多次。事实上,SQL服务器在文本处理方面非常慢,搜索也不例外。 AFAIK甚至全文索引对于中间子字符串搜索也无济于事。

对于10k记录的呈现查询,我希望每个查询大约40ms来获取计数或所有结果(我的桌面)。您可以在此表上创建计算的持久列,并且所有文本都已连接,并且所有数字都已转换并仅查询该列。它会显着加快速度(在桌面上查询不到10毫秒)。

[computedCol]  AS (((((((((([text1]+' ')+[text2])+' ')+[text3])+' ')+CONVERT([nvarchar](max),[d1]))+' ')+CONVERT([nvarchar](max),[d2]))+' ')+CONVERT([nvarchar](max),[d3])) PERSISTED