首页 > 解决方案 > 编写 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 的行为还是某种错误?

标签: entity-frameworkentity-framework-coreef-core-2.2

解决方案


问题实际上是表达式

x.Sum(f => f.Iznos.Value)

目前,EF Core 仅使用简单的属性访问选择器将聚合方法转换为 SQL。

该问题可以通过在聚合函数之外??使用运算符来解决:

x.Sum(f => f.Iznos) ?? 0

推荐阅读