我现在遇到了 LINQ -> SQL 速度问题。我正在尝试检索超过 10,000 种产品 - 这很好,因为仅将这些产品的代码、名称、描述、ID 检索到列表中的速度大约为 2 秒。
然后我的主要问题是尝试遍历这 10,000 个项目以计算库存数量(基于有多少库存项目(行)比在 db 表中匹配)。这当然会调用 10,000 多次 SQL 来解决这个问题——这会花费很多时间。我需要这个计算,然后将我的过滤器基于特定数量的过滤器。
IEnumerable<Product> filteredRecords = warehousing.GetProducts(wID); // Takes under 2 seconds for 10k records
var data = filteredRecords
.Select(p => new
{
ID = p.ProductID,
ProductName = p.Product.Name,
ProductCode = p.Product.Code,
StockLevel = stock.GetTotalStockCount(p.ProductID, p.WarehouseID.Value)
}).OrderBy(l => l.StockLevel).ToArray();
我是应该尝试恢复到 Native Query 以稍微提高速度,还是应该选择一个后台进程来定期计算库存数量并将它们存储到一个单独的表中?
我不确定在这种情况下什么是最佳实践/方法?
编辑 正是这种计算增加了惩罚。 包括 GetTotalStockCount 方法:
public int GetTotalStockCount(Int32? productID = null, Int32? warehouseID = null)
{
var query = from stockItem in _unitOfWork.StockItemRepository.Get(w => w.ProductID == productID).Select(s => s.LocationID)
join warehouseLocation in _unitOfWork.WarehouseLocationRepository.Get(w => w.WarehouseID == warehouseID && w.Type == WarehouseLocationType.Stock).Select(s => s.ID) on stockItem.Value equals warehouseLocation
select new { stockItem.Value };
return query.Count();
}
最佳答案
您应该使用 StockCount
过滤您的数据,除非您确实需要,否则不应使用 ToArray
。
试试这个:
IEnumerable<Product> filteredRecords = warehousing.GetProducts(wID); // Takes under 2 seconds for 10k records
var data = filteredRecords
.Select(p => new
{
ID = p.ProductID,
ProductName = p.Product.Name,
ProductCode = p.Product.Code,
StockLevel = stock.GetTotalStockCount(p.ProductID, p.WarehouseID.Value)
}).Where(l => l.StockLevel > NEEDED_AMOUNT);
并考虑在数据库层移动 GetTotalStockCount
方法以在那里过滤您的数据。
关于C# LINQ-SQL 帮助 - 查询超过 10,000 项的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29559098/