我有查询需要按某些搜索条件过滤大量数据。
搜索通过 3 个表进行:产品、产品主要代码、产品代码。
大型数据(假设大约有 2000 条记录,所以不是那么大,但由其他表数据最大(集位于 ProductCodes 表中。
这是我所做的事情的一个例子。
var result = products.Where(x => x.Code.Contains(se) ||
x.ProductPrimaryCodes.Any(p => p.Code.Contains(se)) ||
x.ProductCodes.Any(p => p.Code.Contains(se)))
.Select(x => new ProductDto
{
Id = x.Id,
Name = x.Name,
InStock = x.InStock,
BrandId = (BrandType)x.BrandId,
Code = x.Code,
CategoryName = x.Category.Name,
SubCategoryName = x.SubCategory.Name,
});
查询执行的时间约为 8-9 秒,因此我相信这种搜索相当长。请注意,无需执行ProductCodes.Any()
,查询将在不到一秒的时间内执行并将结果检索到页面。
产品代码表:
Id,
Code,
ProductId
任何建议如何获得更好的查询性能?
这是对我有用的解决方案。
var filteredProductsByCode = products.Where(x => x.Code.Contains(se));
var filteredProducts = products.Where(x => x.ProductCodes.Any(p => p.Code.Contains(se))
|| x.ProductPrimaryCodes.Any(p => p.Code.Contains(se)));
return filteredProductsByCode.Union(filteredProducts).Select(x => new ProductDto
{
Id = x.Id,
Name = x.Name,
InStock = x.InStock,
BrandId = (BrandType)x.BrandId,
Code = x.Code,
CategoryName = x.Category.Name,
SubCategoryName = x.SubCategory.Name,
}).OrderByDescending(x => x.Id)
显然不是最干净的,但我也会考虑为此类查询引入存储过程。