【发布时间】: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