2010-08-31 58 views
2
var query = from c in db.Customers select c; 
query = query.Where(c => c.Orders.Where(o => o.OrderItems.Where(oi => oi.SellerID == sellerID).Count() > 0).Count() > 0); 

生成SQL:SQL Server 2005:什麼LINQ生成的查詢更好 - 用「Where()」或「Any()」?

SELECT [t0].[CustomerID], [t0].[FirstName], [t0].[LastName], [t0].[Email], [t0].[Company], [t0].[BillingAddress1], [t0].[BillingAddress2], [t0].[ShippingAddress1], [t0].[ShippingAddress2], [t0].[Phone], [t0].[Mobile], [t0].[Fax], [t0].[CreateDT], [t0].[UpdateDT], [t0].[DefaultLanguage], [t0].[DefaultPaymentInfo], [t0].[Active], [t0].[Title], [t0].[LoginID], [t0].[ReferringLink], [t0].[CustomerIP], [t0].[CustomerCountryByIP], [t0].[VatID] 
FROM [dbo].[Customers] AS [t0] 
WHERE ((
    SELECT COUNT(*) 
    FROM [dbo].[Orders] AS [t1] 
    WHERE (((
     SELECT COUNT(*) 
     FROM [dbo].[OrderItems] AS [t2] 
     WHERE ([t2].[SellerID] = 2428) AND ([t2].[OrderID] = [t1].[OrderID]) 
     )) > 0) AND ([t1].[CustomerID] = [t0].[CustomerID]) 
    )) > 0 

var query = from c in db.Customers select c; 
query = query.Where(c => c.Orders.Any(o => o.OrderItems.Any(oi => oi.SellerID == sellerID))); 

生成SQL:

SELECT [t0].[CustomerID], [t0].[FirstName], [t0].[LastName], [t0].[Email], [t0].[Company], [t0].[BillingAddress1], [t0].[BillingAddress2], [t0].[ShippingAddress1], [t0].[ShippingAddress2], [t0].[Phone], [t0].[Mobile], [t0].[Fax], [t0].[CreateDT], [t0].[UpdateDT], [t0].[DefaultLanguage], [t0].[DefaultPaymentInfo], [t0].[Active], [t0].[Title], [t0].[LoginID], [t0].[ReferringLink], [t0].[CustomerIP], [t0].[CustomerCountryByIP], [t0].[VatID] 
FROM [dbo].[Customers] AS [t0] 
WHERE EXISTS(
    SELECT NULL AS [EMPTY] 
    FROM [dbo].[Orders] AS [t1] 
    WHERE (EXISTS(
     SELECT NULL AS [EMPTY] 
     FROM [dbo].[OrderItems] AS [t2] 
     WHERE ([t2].[SellerID] = 2428) AND ([t2].[OrderID] = [t1].[OrderID]) 
     )) AND ([t1].[CustomerID] = [t0].[CustomerID]) 
    ) 

實際執行計劃看起來是一樣的,但反正,什麼是更好的使用?謝謝。

回答

1

隨着EXISTS它立即清楚的數據庫,1匹配的記錄已經足夠。所以只要它發現任何東西,它可以返回。有數......可能不會使用優化。但是既然你說執行計劃是相同的,我猜MS SQL可以理解它如何優化查詢。

就我個人而言,我會選擇存在,因爲它描述了你所需要的。有一個非零計數是不太清楚imho。

+0

好的,謝謝,明白了你的觀點:) – Zelid 2010-08-31 10:26:34