Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C LINQ-SQL帮助-查询超过10000项的数据库_C#_Mysql_.net_Linq - Fatal编程技术网

C# C LINQ-SQL帮助-查询超过10000项的数据库

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

我现在遇到了一个关于LINQ->SQL速度的问题。我正在尝试检索10000多个产品-这很好,因为检索列表中这些产品的代码、名称、描述和id的速度大约为2秒

然后,我的主要问题是尝试迭代这10000个项目,根据db表中匹配的库存项目行数计算库存数量。这当然需要10000多次调用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();

您应该使用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