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)
线
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的产生JOIN到GROUP 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)