web-dev-qa-db-ja.com

Linqサブ選択

LINQで副選択を作成するにはどうすればよいですか。

顧客のリストと注文のリストがある場合、注文のないすべての顧客が必要です。

これは私の擬似コードの試みです:

    var  res = from c in customers 
where c.CustomerID ! in (from o in orders select o.CustomerID) 
select c
15
Dan

どうですか:

var res = from c in customers 
          where !orders.Select(o => o.CustomerID).Contains(c.CustomerID)
          select c;

別のオプションを使用することです:

var res = from c in customers
          join o in orders 
               on c.CustomerID equals o.customerID 
               into customerOrders
          where customerOrders.Count() == 0
          select c;

ところで、LINQ to SQLまたは他の何かを使用していますか?フレーバーが異なれば、「最良の」方法も異なる可能性があります

24
Jon Skeet

これがデータベースに基づいている場合は、ナビゲーションプロパティを使用してみてください(定義されている場合)。

var res = from c in customers
          where !c.Orders.Any()
          select c;

Northwindでは、これによりTSQLが生成されます。

SELECT /* columns snipped */
FROM [dbo].[Customers] AS [t0]
WHERE NOT (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[Orders] AS [t1]
    WHERE [t1].[CustomerID] = [t0].[CustomerID]
    ))

これは非常にうまく機能します。

7
Marc Gravell