我试图在2个列表上执行左连接,我遇到了一个问题,如果右列表为空,左连接就会失败。如何更改查询,使左联接即使列表为空也仍然有效
查询示例:
var received = new List<Foo>{new Foo{ProductId=1,WarehouseSectionId=2, qty= 7}};
var reserved = new List<Foo>{};
var leftOuterJoin = from r in received
join rs in reserved.DefaultIfEmpty()
on new {a = r.ProductId, b = r.WarehouseSectionId } equals new { a = rs.ProductId, b = rs.WarehouseSectionId } into joinedL
from rs in joinedL.DefaultIfEmpty()
select new Foo{
qty = rs != null ? r.qty + rs.qty: r.qty};
.NetFiddle实现问题https://dotnetfiddle.net/Brh74F
现在我可以用if语句来避免这个问题,但是我真的希望能够在纯linq中实现一个正确的左连接。
2条答案
按热度按时间sczxawaw1#
删除中的
.DefaultIfEmpty()
删除
.DefaultIfEmpty()
的原因为:退货
IEnumerable<TSource>
一个IEnumerable,如果source为空,则包含defaultValue;否则为源。由于没有将
defaultValue
传递给.DefaultIfEmpty()
,因此当reserved
为空列表时,它将返回null
。和
select r
,因为您希望从LEFT表返回数据。Sample program
更新:
如果你访问的是RIGHT表(
rs
),你需要先为rs
做null checking
first,然后为null情况做next处理。c90pui9n2#
在新的检查中为null,并且不需要删除defaultifempty()
新{qty =r?.qty??0}