C# C LINQ-SQL帮助-查询超过10000项的数据库
我现在遇到了一个关于LINQ->SQL速度的问题。我正在尝试检索10000多个产品-这很好,因为检索列表中这些产品的代码、名称、描述和id的速度大约为2秒 然后,我的主要问题是尝试迭代这10000个项目,根据db表中匹配的库存项目行数计算库存数量。这当然需要10000多次调用SQL来解决这个问题,这需要很多时间。我需要这个计算,然后根据我的过滤器,只有那些与特定的数额C# C LINQ-SQL帮助-查询超过10000项的数据库,c#,mysql,.net,linq,C#,Mysql,.net,Linq,我现在遇到了一个关于LINQ->SQL速度的问题。我正在尝试检索10000多个产品-这很好,因为检索列表中这些产品的代码、名称、描述和id的速度大约为2秒 然后,我的主要问题是尝试迭代这10000个项目,根据db表中匹配的库存项目行数计算库存数量。这当然需要10000多次调用SQL来解决这个问题,这需要很多时间。我需要这个计算,然后根据我的过滤器,只有那些与特定的数额 IEnumerable<Product> filteredRecords = warehousing.GetPro
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();
您应该使用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);
并考虑数据库层上的GoestGoToStCurnCurt方法来过滤您的数据。
您有两个选项:
也许您应该考虑使用数据库上的视图来生成这些数据,因为GETSooStCurnCurt方法不能翻译成SQL查询以加快速度。当然,这取决于GetTotalStockCount方法的复杂性
在第一个查询中,从Products、StockItem和WarehouseLocation中获取记录,然后按产品对它们进行分组以获得计数聚合您需要更改方法GetTotalStockCount以从内存列表而不是数据库中获取计数
因此,首先从数据库中获取并保存一个列表中的计数,并在函数GetTotalStockCount中使用该列表。问题是GetTotalStockCount方法在单独的数据库中命中,每个记录一次。我不确定这里是否有您的db结构,但您可以尝试以下方法:
.Select(p => new
{
ID = p.ProductID,
ProductName = p.Product.Name,
ProductCode = p.Product.Code,
StockLevel = p.StockItem.WarehouseLocation.Where(w => w.WarehouseID == p.WarehouseID.Value).Count()
}).OrderBy(l => l.StockLevel).ToArray();
这将计算sql查询中的库存级别项,意味着只有一个db命中
注意:.StockITem.WarehouseLocation可能会根据数据库的结构发生变化,但我认为从当前的查询中可以看到这种情况。您可以尝试使用TSQL
select p.ProductID, p.Product.Name, p.Product.Code, count(*)
from StockItemRepository p
join WarehouseLocationRepository w
on p.ProductID = w.WarehouseID.Value
and w.Type == WarehouseLocationType.Stock
group by p.ProductID, p.Product.Name, p.Product.Code
你能告诉我们GetTotalStockCount方法吗?一般来说,你应该做的是列出,然后你可以在列表上查询它是否要进行那么多调用。听起来你想按ProductID对数据进行分组以获得库存水平。我说的对吗?@Dhunt请参阅count方法的编辑。我将尝试这种方法并报告结果。
select p.ProductID, p.Product.Name, p.Product.Code, count(*)
from StockItemRepository p
join WarehouseLocationRepository w
on p.ProductID = w.WarehouseID.Value
and w.Type == WarehouseLocationType.Stock
group by p.ProductID, p.Product.Name, p.Product.Code