entity-framework - 编写 ef 核心语句,该语句在 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();
Preform 在内存中,但不在 SQL 中。
我的上下文警告我
无法翻译 LINQ 表达式“Count()”,将在本地计算。
我想向 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 是 Nullable (十进制?),而PosBlagajnik上的inkas是非 Nullable 。通过使用 .Value 我确实转换了十进制?为十进制。看起来这让 ef 在本地执行所有查询感到困惑。
这通常是 ef 的行为还是某种错误?
解决方案
问题实际上是表达式
x.Sum(f => f.Iznos.Value)
目前,EF Core 仅使用简单的属性访问选择器将聚合方法转换为 SQL。
该问题可以通过在聚合函数之外??
使用运算符来解决:
x.Sum(f => f.Iznos) ?? 0
推荐阅读
- tensorflow - 如何修改 Tensorflow 2.0 中的 epoch 数?
- laravel - 如何将excel数据导入laravel
- android - Firebase App Check 无法正常工作(解码 App Check 令牌失败)
- python - 如何在 PySpark 中进行数据分析?错误:DataFrame' 对象没有属性 'ix'
- reactjs - 如何将reactiveVar返回添加到数组?
- python - 在 Python 中重现 Excel 平均值和舍入
- eclipse - STM32CubeIDE 和多目标
- bash - 如何让 cron 作业在指定时间启动 VPN?
- google-sheets - 3个日期之间的平均天数?谷歌表格
- javascript - 数据不会从弹出窗口存储在 chrome.storage.local 中以进行 chrome 扩展