删除 Entity Framework Core 查询中重复的 SUM 子查询

Mar*_*scu 3 c# linq entity-framework-core

我有以下 LINQ 代码:

return from policy in db.Policy.Include(it => it.LedgerLines)
       let balance = policy.LedgerLines.Sum(it => it.Amount)
       where balance > 0m && balance < 5m
       select policy;
Run Code Online (Sandbox Code Playgroud)

这被翻译成

return from policy in db.Policy.Include(it => it.LedgerLines)
       let balance = policy.LedgerLines.Sum(it => it.Amount)
       where balance > 0m && balance < 5m
       select policy;
Run Code Online (Sandbox Code Playgroud)

有没有办法只执行SUM([p1].[Amount])一次子查询?

(EF 核心 3.1)

Iva*_*oev 5

线

let balance = policy.LedgerLines.Sum(it => it.Amount)
Run Code Online (Sandbox Code Playgroud)

这相当于中间投影,清楚地表明了重用表达式的意图。

但是 EF Core 查询翻译器通过尽可能多地消除子查询,付出了很多努力来生成“漂亮”的查询。不幸的是,在这种情况下,这方面似乎太过分了。

话虽如此,您可以将其视为翻译缺陷,保留 LINQ 查询“原样”并等待改进的翻译 - EFC 5.x 没有改进,可能是 EFC 6.0 或更高版本,如果有的话。

但这里是一个不那么分心招让EFC 3.1 / 5.x的产生JOINGROUP BY子查询和重用的SUM表达。

对原始 LINQ 查询的唯一更改是将上述let语句替换为以下内容


from balance in policy.LedgerLines
    .GroupBy(it => it.PolicyId)
    .Select(g => g.Sum(it => it.Amount))
Run Code Online (Sandbox Code Playgroud)

被翻译成

let balance = policy.LedgerLines.Sum(it => it.Amount)
Run Code Online (Sandbox Code Playgroud)