我可以将以下两个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();
答案 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