2010-08-31 44 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