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 を生成します。

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])
    )

実際の実行計画は同じように見えますが、どちらを使用するのが良いでしょうか? ありがとう。

4

1 に答える 1

1

を使用するEXISTSと、一致するレコードが 1 つあれば十分であることがデータベースにすぐにわかります。そのため、何かを見つけるとすぐに戻ることができます。カウントでは...その最適化は使用されない可能性があります。しかし、実行計画は同じだとおっしゃっているので、MS SQL はクエリを最適化する方法を理解していると思います。

個人的には、必要なものを正確に説明しているため、存在するものを選択します。ゼロ以外のカウントを持つことは、あまり明確ではありません。

于 2010-08-31T10:20:30.197 に答える