Dan*_*Dan 15 c# linq outer-join
如何在LINQ中编写子选择.
如果我有一个客户列表和一个订单列表,我希望所有没有订单的客户.
这是我的伪代码尝试:
var res = from c in customers
where c.CustomerID ! in (from o in orders select o.CustomerID)
select c
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 24
怎么样:
var res = from c in customers
where !orders.Select(o => o.CustomerID).Contains(c.CustomerID)
select c;
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用:
var res = from c in customers
join o in orders
on c.CustomerID equals o.customerID
into customerOrders
where customerOrders.Count() == 0
select c;
Run Code Online (Sandbox Code Playgroud)
您使用LINQ to SQL还是别的什么,顺便问一下?不同的口味可能有不同的"最佳"方式
如果这是由数据库支持的,请尝试使用导航属性(如果已定义它们):
var res = from c in customers
where !c.Orders.Any()
select c;
Run Code Online (Sandbox Code Playgroud)
在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]
))
Run Code Online (Sandbox Code Playgroud)
这项工作做得很好.