【发布时间】:2021-09-02 11:34:48
【问题描述】:
我有以下 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;
这被翻译成
SELECT ...
FROM [Policy] AS [p]
LEFT JOIN [PolicyLedger] AS [p0] ON [p].[Id] = [p0].[PolicyId]
WHERE (((SELECT SUM([p1].[Amount])
FROM [PolicyLedger] AS [p1]
WHERE [p].[Id] = [p1].[PolicyId]) > 0.0))
AND ((SELECT SUM([p2].[Amount])
FROM [PolicyLedger] AS [p2]
WHERE [p].[Id] = [p2].[PolicyId]) < 5.0)
ORDER BY [p].[Id], [p0].[Id]
有没有办法只执行一次SUM([p1].[Amount]) 子查询?
(EF 核心 3.1)
【问题讨论】:
-
你能从
LedgerLine实体开始吗? -
有趣的想法,@Progman - 我尝试从分类帐行开始并按策略 ID 分组,但我从 EF 核心收到一个错误,说它无法对分组部分做些什么。另外,我不想为了删除子查询而做一个非常晦涩的查询——我宁愿让它慢一点也不要太复杂。
-
如果删除
Include会发生什么 -
@Charlieface 不多——SQL 发生了一些变化(删除了 JOIN),但两个 SUM 子查询仍然存在。
标签: c# linq entity-framework-core