LINQで副選択を作成するにはどうすればよいですか。
顧客のリストと注文のリストがある場合、注文のないすべての顧客が必要です。
これは私の擬似コードの試みです:
var res = from c in customers
where c.CustomerID ! in (from o in orders select o.CustomerID)
select c
どうですか:
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または他の何かを使用していますか?フレーバーが異なれば、「最良の」方法も異なる可能性があります
これがデータベースに基づいている場合は、ナビゲーションプロパティを使用してみてください(定義されている場合)。
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]
))
これは非常にうまく機能します。