GroupJoin,SelectMany,GroupBy和Sum

桑德

我正在尝试使用GroupJoin和SelectMany在linq中进行“左外部联接”,但是随后我还想使用GroupBy和Sum来聚合结果。

但是,当我执行以下代码时,我得到:

System.NotSupportedException:'无法在LINQ to Entities查询中构造实体或复杂类型'... tableB'。

Repo<tableA>().All()
    .Where(i =>
        (i.Date >= dateF && i.Date <= dateT)
        &&
        i.EndOfMonth
    )
    .GroupJoin(
        Repo<tableB>().All().Where(i => (i.fieldX = ...somevalue... )), 
        dt => dt.DayIndex, scd => scd.DayIndex, (dt, scd) =>
            new {
                dt = dt,
                scd = scd,
            }
    )
    .SelectMany(
        jn => jn.scd.DefaultIfEmpty( new tableB { Count1 = 0, Count2 = 0 }), // runtime error here
        (dt,scd) => new { dt=dt.dt, scd = scd}
        )
    .GroupBy(i => i.dt)
    .Select(i => new CountListItem
    {
        Date = i.Key.Date,
        CountField1 = i.Sum(o => o.scd.Count1),
        CountField2 = i.Sum(p => p.scd.Count2)
     })
     .OrderBy(i => i.Date)
     .ToList()

当我刚DefaultIfEmpty()得到错误时:

System.InvalidOperationException:'强制转换为值类型'System.Int32',因为物化值为null。结果类型的通用参数或查询必须使用可为空的类型。

我必须承认,这是因为Sum遇到空值。

我试过了i.Sum(o => o.scd.Count1 ?? 0,但是它说:

运算符'??' 不能应用于类型为'int'和'int'的操作数[sic]

我也尝试过,DefaultIfEmpty(new { Count1 = 0, Count2 =0})但这给了我>

...无法推断类型。

我该如何工作?

伊万·斯托夫

避免第一个异常很容易-只需对无参数的左外部联接使用标准模式DefaultIfEmpty()

第二个问题源于SQL和LINQ(C#)查询数据类型之间的差异。SQL查询NULL本机支持值,NULL即使源表达式不可为空,也可以返回如您在最后一次尝试中所注意到的那样,LINQ(尤其是C#编译器)对该语法不满意。

技巧是使用C#强制转换运算符将非可空类型提升为可空类型,然后将空合并运算符应用于结果表达式:

CountField1 = i.Sum(o => (int?)o.scd.Count1 ?? 0),
CountField2 = i.Sum(o => (int?)o.scd.Count2 ?? 0),

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章