【问题标题】:Write ef core statement that preform count on SQL编写对 SQL 执行计数的 ef core 语句
【发布时间】:2019-08-04 04:05:35
【问题描述】:

为什么 .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 中。
我的上下文警告我

无法翻译 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

在 cmets 之后编辑

感谢 @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 的行为还是某种错误?

【问题讨论】:

  • 嗨,你能显示整个查询吗?我怀疑涉及到一些GroupBy 操作,因为它只是一个简单的表(DbSet)查询,它会起作用。
  • @IvanStoev my appolgies,这确实会执行 SQL 我有其他的我会尽快编辑我的问题
  • @IvanStoev 再次抱歉,我确实编辑了我的问题,包括我试图发送到 SQL 的原始 ef 语句和新 tsql
  • 没问题。但即使是最后一次更新,它也应该转换为 SQL。 f.Iznos 是什么?可空类型?如果您只选择x.Count()(注释掉, inkas = x.Sum(f => f.Iznos.Value))怎么办?
  • @IvanStoev f.Iznos 是十进制? , 看起来当我没有在 x.Sum() 中包含 .Value 时,确实会执行 SQL 组。我确实使用了 .Value,因为我的另一个模型 PosBlagajnik 是不可为空的

标签: entity-framework entity-framework-core ef-core-2.2


【解决方案1】:

问题其实是表达方式

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

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

这个问题可以通过在聚合函数之外使用??操作符解决:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多