在之前的一个问题中,我问过如何获得客户第一个订单,因此得到了答复:
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
});
这很棒,但如何在上面加入左外连接?也就是说,即使他们没有订单,也要返回所有客户,例如:
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
});
我知道,事后我应该同时问这个问题。
谢谢,乔
答案 0 :(得分:5)
首先,使用let
来完成这样的连接首先并不理想。 LINQ中有一个join
子句,原因是:)
在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
};
通常左外连接使用from foo in bar.DefaultIfEmpty
而不是let foo = bar.FirstOrDefault()
,但在这种情况下,您只能在第一场比赛之后,因此采用不同的方法。
我很确定这可以逻辑 - SQL翻译是否有效是另一回事。