Linq Sub-Select

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还是别的什么,顺便问一下?不同的口味可能有不同的"最佳"方式

  • 是的,很可能.这样做的方法很多.可以说,拥有一个与Any()相反的Empty()或None()扩展方法也是很好的... (2认同)

Mar*_*ell 7

如果这是由数据库支持的,请尝试使用导航属性(如果已定义它们):

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)

这项工作做得很好.