LINQ Left Outer Join与Let结合使用

Joe*_*Net 3 c# linq

在之前的一个问题中,我问过如何获得客户第一个订单,因此得到了回答:

var minOrders = from customer in DataSet.Customers                 
let order = (from o in DataSet.Orders where o.CustomerId == customer.CustomerId
order by o.OrderTimestamp                              
select o).first()
select new {
    customer.Name,
    order.OrderAmount
}); 
Run Code Online (Sandbox Code Playgroud)

这很棒,但是我如何在上面加入左外连接呢?也就是说,即使他们没有订单,也要返回所有客户,例如:

var minOrders = from customer in DataSet.Customers LEFT OUTER JOIN
let order = (from o in DataSet.Orders where o.CustomerId == customer.CustomerId
order by o.OrderTimestamp                              
select o).first()
select new {
    customer.Name,
    order.OrderAmount
});
Run Code Online (Sandbox Code Playgroud)

我知道,事后我应该同时问这个问题.

谢谢,乔

Jon*_*eet 5

首先,使用let这样的连接首先并不理想.joinLINQ中有一个条款是有原因的:)

LINQ 中不特别支持左外连接,但你可以像这样伪造它们:

var minOrders = from customer in DataSet.Customers                 
                join order in DataSet.Orders.OrderBy(o => o.OrderTimestamp)
                     on customer.CustomerId equals o.CustomerId
                     into customerOrders
                let order = customerOrders.FirstOrDefault()
                select new {
                    customer.Name,
                    OrderAmount = order == null ? 0m : order.OrderAmount
                };
Run Code Online (Sandbox Code Playgroud)

通常左外连接使用from foo in bar.DefaultIfEmpty而不是let foo = bar.FirstOrDefault()在这种情况下,你只是在第一场比赛之后,因此不同的方法.

我很确定这在逻辑上是有效的 - SQL翻译是否有效是另一回事.