簡體   English   中英

Linq查詢問題(ado.net請求太多)

[英]Linq query problem (too many ado.net request)

我的linq應用程序遇到問題。

我有OrdersOrderChangeLogOrderItems表。 在1個查詢中,我想加載訂單和相關表。 我用的是Linq。

 return from p in _db.dbOrders
 select new Order
 {
 ID = p.ID, 
 OrderStatusChangelog = new List<OrderStatusChangelog>( GetOrderStatusChangelog().Where(x => x.OrderID == p.ID)),
 Items = new List<OrderItem>(GetOrderItems(p.ID)), };

在這個變體它需要太多的ADO.NET請求(見圖像1) 圖像1全尺寸 此搜索

但。 如果我發表評論

Items = new List<OrderItem>(GetOrderItems(p.ID))

完美的結果( image2原圖 圖像2

為什么一個人這樣工作?

PS My T-SQL(由LINQ生成):

{SELECT [t0].[ID], [t0].[UserID], [t0].[DateOrder] AS [DateCreated], [t0].[ControlGUID] AS [Guid], [t0].[StatusID], [t1].[ID] AS [ID2], [t1].[OrderID], [t1].[StatusID] AS [OrderStatusID], [t1].[Comment] AS [StatusMessage], [t1].[UserID] AS [UserID2], [t1].[Date], [t2].[FullName] AS [UserName], (
SELECT COUNT(*)
FROM [dbo].[dbOrderStatusChangelog] AS [t3]
INNER JOIN [dbo].[dbUsers] AS [t4] ON [t4].[ID] = [t3].[UserID]
WHERE [t3].[OrderID] = [t0].[ID]
) AS [value], [t0].[ShippingFLP], [t0].[ShippingAddress] AS [ShippingAddressContent], [t0].[ShippingRegionID], [t0].[ShippingCity], [t0].[ShippingZIPCode], [t0].[ShippingPhone], [t0].[ShippingMetroID], [t0].[PaymentFLP], [t0].[PaymentAddress] AS [PaymentAddressContent], [t0].[PaymentRegionID], [t0].[PaymentCity], [t0].[PaymentZIPCode], [t0].[PaymentPhone], [t0].[TrackingNumber], [t0].[DateShipped], [t0].[ShippingCost] AS [Rate], [t0].[ShippingName] AS [Name], [t0].[ShippingTypeID], [t0].[PaymentName] AS [Name2], [t0].[PaymentTypeID], [t0].[SourceID], [t0].[CustomerComment], [t0].[CustomerEmail], [t0].[CustomerFLP], [t0].[DiscountAmount] AS [discountAmount], [t0].[DiscountReason] AS [discountReason], [t0].[Amount]
FROM [dbo].[dbOrders] AS [t0]
LEFT OUTER JOIN ([dbo].[dbOrderStatusChangelog] AS [t1]
    INNER JOIN [dbo].[dbUsers] AS [t2] ON [t2].[ID] = [t1].[UserID]) ON [t1].[OrderID] = [t0].[ID]
WHERE (CONVERT(Int,[t0].[StatusID])) IN (@p0, @p1, @p2)
ORDER BY [t0].[ID] DESC, [t1].[ID], [t2].[ID]}

表格圖 表

UPD1

 private IQueryable<OrderItem> GetOrderItems(int orderID)
    {
        return from p in _db.dbOrderItems
               where p.OrderID == orderID
               select new OrderItem
                          {
                              ID = p.ID,
                              ItemPrice = p.Price,
                              OrderID = p.OrderID,
                              Quantity = p.Quantity,
                              Product = new Product
                                            {
                                                ID = p.ProductID,
                                                Name = p.ProductName,
                                                Brand = new Brand { Name = p.dbProduct.dbBrand.Name }
                                            }
                          };
    }


    private IQueryable<OrderStatusChangelog> GetOrderStatusChangelog()
    {
        return from p in _db.dbOrderStatusChangelogs
               select new OrderStatusChangelog
                          {
                              Date = p.Date,
                              ID = p.ID,
                              OrderID = p.OrderID,
                              OrderStatusID = p.StatusID,
                              StatusMessage = p.Comment,
                              UserID = p.UserID,
                              UserName = p.dbUser.FullName
                          };
    }
Items = new List...

這將導致您正在查詢的項目的枚舉,從而對創建的每個列表(和復制的元素)強制調用數據庫。

您可以推遲枚舉和對使用者的調用,然后將它們轉換為列表,或者可以創建一種方法來根據需要為它們創建列表,或者通過將定義IEnumerable並更改它們的交互方式返回IQueryable

真正的問題是,是否需要將每個項目都作為一個列表並在主查詢中完全填充?或者您可以將執行延遲到對數據進行操作之前?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM