编写对 SQL 执行计数的 ef 核心语句
Write ef core statement that preform count on SQL
为什么.net core 2.2.如果这个
var posBlagajnik = rampa.Doc.Where(x => x.SmjenaId == smjena.Id && (x.DocTipNavigation.IsRacun || x.DocTipNavigation.IsStorno)).GroupBy(x => x.User.ImeIprezime)
.Select(x => new PosBlagajnik() { ime = x.Key, brojRacuna = x.Count(), inkas = x.Sum(f => f.Iznos.Value) }).ToList();
在内存中预制,但不在 SQL。
我的上下文警告我
The LINQ expression '"Count()"' could not be translated and will be
evaluated locally.
我想发送给 SQL 这样的东西。
select
AspNetUsers.ImeIprezime
,COUNt(*) as brojRacuna
,sum(iznos) as inkas
from doc
inner join AspNetUsers on doc.user_id=AspNetUsers.id
inner join dokumenti on doc.doc_tip=dokumenti.id
where doc.smjena_id=79 and (dokumenti.isRacun = 1 or dokumenti.isStorno=1)
group by AspNetUsers.ImeIprezime
评论后编辑
感谢@IvanStoev 的帮助,我确实设法编写了 prefom sql 聚合的 ef。
这是根据研究得出的新问题
当我将我的 ef 查询更改为
var posBlagajnik = rampa.Doc
.Where(x => x.SmjenaId == smjena.Id && (x.DocTipNavigation.IsRacun || x.DocTipNavigation.IsStorno))
.GroupBy(x => x.User.ImeIprezime)
.Select(x => new PosBlagajnik() { ime = x.Key, brojRacuna = x.Count(),
inkas = x.Sum(f => f.Iznos)
}).ToList();
Ef 开始执行 sql 聚合。
最初我使用 x.Sum(f => f.Iznos.Value)
因为 f.Iznos 是可空的(十进制?),inkas 在 PosBlagajnik是不可空的。通过使用 .Value 我确实转换了小数?到十进制。
看起来这让 ef 无法在本地执行所有查询。
这通常是 ef 的行为还是某种错误?
其实是表达式的问题
x.Sum(f => f.Iznos.Value)
目前 EF Core 转换为 SQL 仅聚合具有简单 属性 访问选择器的方法。
这个问题可以通过在聚合函数之外使用??
运算符来解决:
x.Sum(f => f.Iznos) ?? 0
为什么.net core 2.2.如果这个
var posBlagajnik = rampa.Doc.Where(x => x.SmjenaId == smjena.Id && (x.DocTipNavigation.IsRacun || x.DocTipNavigation.IsStorno)).GroupBy(x => x.User.ImeIprezime)
.Select(x => new PosBlagajnik() { ime = x.Key, brojRacuna = x.Count(), inkas = x.Sum(f => f.Iznos.Value) }).ToList();
在内存中预制,但不在 SQL。
我的上下文警告我
The LINQ expression '"Count()"' could not be translated and will be evaluated locally.
我想发送给 SQL 这样的东西。
select
AspNetUsers.ImeIprezime
,COUNt(*) as brojRacuna
,sum(iznos) as inkas
from doc
inner join AspNetUsers on doc.user_id=AspNetUsers.id
inner join dokumenti on doc.doc_tip=dokumenti.id
where doc.smjena_id=79 and (dokumenti.isRacun = 1 or dokumenti.isStorno=1)
group by AspNetUsers.ImeIprezime
评论后编辑
感谢@IvanStoev 的帮助,我确实设法编写了 prefom sql 聚合的 ef。
这是根据研究得出的新问题
当我将我的 ef 查询更改为
var posBlagajnik = rampa.Doc
.Where(x => x.SmjenaId == smjena.Id && (x.DocTipNavigation.IsRacun || x.DocTipNavigation.IsStorno))
.GroupBy(x => x.User.ImeIprezime)
.Select(x => new PosBlagajnik() { ime = x.Key, brojRacuna = x.Count(),
inkas = x.Sum(f => f.Iznos)
}).ToList();
Ef 开始执行 sql 聚合。
最初我使用 x.Sum(f => f.Iznos.Value)
因为 f.Iznos 是可空的(十进制?),inkas 在 PosBlagajnik是不可空的。通过使用 .Value 我确实转换了小数?到十进制。
看起来这让 ef 无法在本地执行所有查询。
这通常是 ef 的行为还是某种错误?
其实是表达式的问题
x.Sum(f => f.Iznos.Value)
目前 EF Core 转换为 SQL 仅聚合具有简单 属性 访问选择器的方法。
这个问题可以通过在聚合函数之外使用??
运算符来解决:
x.Sum(f => f.Iznos) ?? 0