我正在尝试使用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] 删除。
我来说两句