gpt4 book ai didi

c# - GroupJoin、SelectMany、GroupBy 和 Sum

转载 作者:行者123 更新时间:2023-11-30 23:04:59 30 4
gpt4 key购买 nike

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

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

System.NotSupportedException: 'The entity or complex type '...tableB' cannot be constructed in a LINQ to Entities query.'

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: 'The cast to value type 'System.Int32' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.'

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

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

Operator '??' cannot be applied to operands of type 'int' and 'int' [sic]

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

... type cannot be inferred.

我怎样才能让它工作?

最佳答案

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

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

诀窍是使用 C# 转换运算符将不可空类型提升为可空类型,然后将空合并运算符应用于结果表达式:

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

关于c# - GroupJoin、SelectMany、GroupBy 和 Sum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49014538/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com