当右侧为空时,列表上的Linq左连接失败

ezykj2lf  于 2023-05-04  发布在  其他
关注(0)|答案(2)|浏览(256)

我试图在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中实现一个正确的左连接。

sczxawaw

sczxawaw1#

删除中的.DefaultIfEmpty()

join rs in reserved.DefaultIfEmpty()

删除.DefaultIfEmpty()的原因为:

public static System.Collections.Generic.IEnumerable<TSource> DefaultIfEmpty<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, TSource defaultValue);

退货
IEnumerable<TSource>一个IEnumerable,如果source为空,则包含defaultValue;否则为源。
由于没有将defaultValue传递给.DefaultIfEmpty(),因此当reserved为空列表时,它将返回null
select r,因为您希望从LEFT表返回数据。

var leftOuterJoin = from r in received
                    join rs in reserved
                    on new { a = r.ProductId, b = r.WarehouseSectionId } equals new { a = rs.ProductId, b =  rs.WarehouseSectionId } into joinedL
                    from rs in joinedL.DefaultIfEmpty()
                    select r;

Sample program

更新

如果你访问的是RIGHT表(rs),你需要先为rsnull checkingfirst,然后为null情况做next处理。

c90pui9n

c90pui9n2#

在新的检查中为null,并且不需要删除defaultifempty()
新{qty =r?.qty??0}

相关问题