linq 按可能的空列分组,不能使用空传播

ifmq2ha2  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(106)

这是一个两个表的左连接,在group by中的g.rpt.Location行,g.rpt可能是空的,所以我收到了关于取消引用一个可能的空对象的警告。ctx是一个代码优先的Entity Frameworks数据库。

var query = ctx.ObjTable
    .GroupJoin(ctx.RptTable, obj => obj.Upc,
        rpt => rpt.Upc,
        (obj, rpt) => new { obj, rpt })
    .SelectMany(j => j.rpt.DefaultIfEmpty(), (j, rpt) => new
        {
            j.obj, rpt,
        })
    .GroupBy(g => new
        {
            g.rpt.Location,  //Problem here
            g.obj.Category,
            g.obj.Desc,
        }
    .Select(s => new MyClass
    {
        Location = s.Key.Location,
        Category = s.Key.Category,
        Desc = s.Key.Desc,
        Total = s.Sum(x => x.rpt.Numeric),
    });

我尝试了g.rpt?.Location,但是得到了“表达式树lambda可能不包含空传播操作符”。
已尝试g.rpt == null ? null : g.rpt。已尝试使用??。
我试过了,似乎有点牵强,但我试过了...

.GroupBy(g => g.rpt == null 
    ? new
        {
            g.rpt.Location,
            g.obj.Category,
            g.obj.Desc,
        } 
    : new
        {
            g.obj.Category,
            g.obj.Descriptor,
        })
t9aqgxwy

t9aqgxwy1#

您可以在DefaultOrEmpty中提供自己的默认值,例如

var defaultRpt = new Rpt {Location = "", Numeric = 0}

...
    .SelectMany(j => j.rpt.DefaultIfEmpty(defaultRpt), (j, rpt)
6tqwzwtp

6tqwzwtp2#

多亏了Mike Mozhaaev的评论,这个方法成功了。提取SelectMany中进一步操作所需的值。
我希望我能选择两个正确的答案,因为他提供的另一个答案也有效。

var query = ctx.ObjTable
    .GroupJoin(ctx.RptTable, obj => obj.Upc,
        rpt => rpt.Upc,
        (obj, rpt) => new { obj, rpt })
    .SelectMany(j => j.rpt.DefaultIfEmpty(), (j, rpt) => new
        {
            j.obj,
            Upc = rpt != null ? rpt.Upc : string.Empty,
            Numeric = rpt != null ? (int?)rpt.Numeric : null;
        })
    .GroupBy(g => new
        {
            g.Location,  //Problem here
            g.obj.Category,
            g.obj.Desc,
        }
    .Select(s => new MyClass
    {
        Location = s.Key.Location,
        Category = s.Key.Category,
        Desc = s.Key.Desc,
        Total = s.Sum(x => x.Numeric),
    });

相关问题