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

标签 c# mysql .net linq

我现在遇到了 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/

相关文章:

c# - WPF ObservableCollection 两种方式绑定(bind) XML 文件

c# - .Net Web Api不显示必需属性的错误消息

c# - MVVM,Catel和图形UI交互

c# - 具有主体(setter 或 getter)之一的属性

php - Angular API 日期不工作 : timestamp from PHP backend needs to be refactored?

php - 检查 PHP 中日期时间之间的间隔

c# - XmlSerializer 属性在使用 WCF 的 Web 服务中无效

C# 在另一个阅读器解决方案中使用阅读器?

.net - 自动化展望

c# - Azure Batch - 资源文件准备任务