我正在逐步完成此代码,这种方法需要一段时间才能遍历20K产品。 是否有替代foreach循环来加快速度?这可以用Linq完成吗?
public IEnumerable<IProduct> ReturnOnlyRequestedSkus(IEnumerable<IProduct> products, IEnumerable<string> requestedSkus)
{
var productList = new List<IProduct>();
var allowedProducts = from sku in requestedSkus
join product in products
on sku.ToUpper() equals product.Sku.ToUpper()
select product;
foreach (var product in allowedProducts)
{
if (product.ItemType.Equals("Kit", StringComparison.OrdinalIgnoreCase)
&& product.KitIncludes != null)
{
var skusInKit = product.KitIncludes.Select(x => x.Sku);
var skusInProducts = products.Select(x => x.Sku);
if (skusInProducts.ContainsAll(skusInKit))
{
productList.Add(product);
}
}
}
return productList;
}
答案 0 :(得分:-1)
假设您实际上是在尝试查询数据库(您没有说,但大多数处理20K +产品的应用程序往往不会将它们保留在内存中),请改用IQueryable
并将其转换为一个大数据库LINQ表达式并将其传递给数据库以进行评估,而不是将其全部读入内存以进行客户端查询和列表构建。
public IQueryable<IProduct> ReturnOnlyRequestedSkus(IQueryable<IProduct>
products, IEnumerable<string> requestedSkus)
{
return products
.Where(p => requestedSkus.Any(sku => String.Equals(p.Sku, sku, StringComparison.OrdinalIgnoreCase &&
p.ItemType.Equals("Kit", StringComparison.OrdinalIgnoreCase) &&
p.KitIncludes != null &&
...
;
}
那样的方式(i)你穿过电线越来越少; (ii)数据库本身可以优化查询; (iii)您的搜索结果会被延迟评估,以便有人对其进行.First()
调用,或.Count()
它无法全部获取。
但最后一部分检查的是什么?套件中的所有零件都是产品本身?您是否应该使用约束在数据库级别确保某些内容?