Linq 查询在代码中引发超时,但在 LinqPad 上工作正常

Posted

技术标签:

【中文标题】Linq 查询在代码中引发超时,但在 LinqPad 上工作正常【英文标题】:Linq Query Throws Timeout in code but Works fine on LinqPad 【发布时间】:2021-05-25 11:47:47 【问题描述】:

当我在 LinqPad 上运行 Linq 查询时,只需 4-5 秒即可返回 5000 行,但是当我使用 Entity Framework 在代码中运行相同的查询时,它会引发超时。

可能的问题是什么?

提前致谢。

下面是查询:

var resultSale =           
    from product in Products
    join productInfo in ProductInfoSummaries on product.ID equals productInfo.ProductID
    join productDetail in ProductDetails on new  Id = product.ID, storeId = product.CreatedInStore  equals new  Id = productDetail.ProductID, storeId = productDetail.StoreID 
    
    join productInventoryOtherStore in InventoryOtherStores on product.ID equals productInventoryOtherStore.ProductID
    into productInventories
    from productInventoryOtherStore in productInventories.DefaultIfEmpty()
    
    join saleLine in SaleLines on productDetail.ID equals saleLine.ArtikkelNr
    join sales in Sales on saleLine.OrderID equals sales.ID
    
    where saleLine.ArtikkelNr != null
    && saleLine.DatoTid >= new DateTime(2018, 01, 01)
    && saleLine.DatoTid <= new DateTime(2019,11,21)
    && sales.StoreID == 14
    && (sales.OrderType == 1 || sales.OrderType == 2 || sales.OrderType == 4 || sales.OrderType == 6)
    && productDetail.SupplierProductNo != null
    && productDetail.Deleted == null
    && (productInfo.Inactive == null || productInfo.Inactive == false)
    && (product.CreatedInStore == 14 || product.CreatedInStore == 0 || product.CreatedInStore == null)
    
    group new  saleLine.AntallEnheter, sales.OrderType  by new  product.ID, productInventoryOtherStore.Amount  into g

    select new ProductSaleSummaryVM
    
        ID = g.Key.ID,
        Inventory = (double)g.Key.Amount,
        TotalSold = g.Sum(x => x.OrderType !=4 ? x.AntallEnheter : 0) ?? 0,
        TotalWastage = g.Sum(x => x.OrderType ==4 ?  x.AntallEnheter : 0) ?? 0,
        TotalOrderedQty = 0
    ;
    
var resultSupplierOrder = 
    from supplierOrderLine in SupplierOrderLines
    join supplierOrder in SupplierOrders on supplierOrderLine.SupplierOrderID equals supplierOrder.ID
    where supplierOrderLine.Deleted == null
    && supplierOrder.Status != 1
    && supplierOrder.StoreID == 14
    group supplierOrderLine by supplierOrderLine.ProductID into g
    select new ProductOrderDetailsVM
    
        ID = g.Key,
        TotalOrderedQty = (double)g.Sum(x => x.ConsumerQuantity - x.QuantiyReceived)
    ;
    
var r =   
    (from resSale in resultSale
    join resSupplierOrder in resultSupplierOrder on resSale.ID equals resSupplierOrder.ID
    into resSupplierOrders
    from resSupplierOrder in resSupplierOrders.DefaultIfEmpty()
    orderby resSale.ID
    select new ProductSaleSummaryVM
    
        ID = resSale.ID,
        Inventory = resSale.Inventory,
        TotalSold = resSale.TotalSold,
        TotalWastage = resSale.TotalWastage,
        TotalOrderedQty = resSupplierOrder.TotalOrderedQty ?? 0
    )
    .Where(x => x.Inventory +  x.TotalOrderedQty < x.TotalSold);
            
r.Dump();

【问题讨论】:

可能是连接问题。检查您的连接字符串是否正确,并检查您的数据库服务器是否已启动并正在运行。 @rdr20 谢谢。我的数据库连接已经正常工作了。仅当我尝试获取大记录时才会引发此超时错误 您是否尝试将命令超时调整为更长的? 【参考方案1】:

尝试在 linqpad 中使用实体框架,看看它是否能给你任何线索。请参阅此链接了解如何在 linqpad 中使用实体框架

https://www.linqpad.net/EntityFramework.aspx

【讨论】:

谢谢,@mjb,但我尝试过但对我的情况没有帮助,因为我的数据库项目有一些我无法在 LinqPad 中提供的配置。 在 LINQPad 6 中,您可以在 LINQ to SQL 和实体框架之间进行选择,而无需创建数据上下文。点击“添加连接”后,选择列表中的第二个选项。 JoeAlbahari,mjb 谢谢。这些建议帮助我解决了问题

以上是关于Linq 查询在代码中引发超时,但在 LinqPad 上工作正常的主要内容,如果未能解决你的问题,请参考以下文章

LINQ 实体框架查询在 EF Core 中不起作用,引发异常

一个上下文引用 LINQ 查询引发多个引用异常 - BUG?

linq 在查询表达式中处理异常

在 Linq 中使用多个包含需要时间来加载性能问题

EF Core 中的查询超时,但在 SSMS 中运行速度很快

执行 linq 查询时出现超时错误