EF Core Linq 中的子查询求和

5

我希望通过在sum查询中输入子查询来获得结果。

当我写入Sql时,以下代码是有效的。

但是在EF上,我该如何在顶部添加另一个select?

SQL

这段代码可以正常工作。

select 
    sum (data.rate)
from 
(
    SELECT 
        t1.Id,
        (c.rate / 
        (SELECT COUNT(1) FROM [table4] AS [t4] WHERE ([t4].[FKId] = p1.Id))) as rate        
FROM [table1] AS [t1]
INNER JOIN [table2] AS [t2] ON ([t1].[FKId] = [t2].[Id])
INNER JOIN [table3] AS [t3] ON ([t1].[FKId] = [t3].[Id]))
as data

C#

var data = await (
    ????
    from t1 in ctx.table1
    join t2 in ctx.table2 on new { t1.FKId} equals new { FKId = t2.Id}
    join t3 in ctx.table3 on new { t1.FKId} equals new { FKId = t3.Id}
    select new
    {
        rate = t3.Rate /
            (from t4 in ctx.table4
             where  t4.FKId == t2.Id
             select t4.Id)
            .Count())
     })
     .SumAsync(sm => (double?)sm.rate ?? 0);

这段 C# 代码不能正常工作。

错误信息:

无法对包含聚合函数或子查询的表达式执行聚合运算。


你正在创建很多未使用的匿名类型。 - NetMage
你的SQL语句写成了where t4.FKId = p1.Id,而你的LINQ语句写成了t4.FKId == t2.Id - 为什么不一样?同样的问题也出现在SQL c.rate和LINQ t3.Rate上吗? - NetMage
1个回答

4
根据此答案,EF Core 3.0 仍无法处理这种情况(!)。但是,您可以在不使用子查询的情况下翻译查询(有效地使用 SelectMany),然后它应该可以工作:
var ans = await (from t1 in ctx.table1
                 join t2 in ctx.table2 on t1.FKId equals t2.Id
                 join t3 in ctx.table3 on t1.FKId equals t3.Id
                 from t4 in ctx.table4
                 where t4.FkId == t2.Id
                 group t4.Id by new { t3.rate, t2.Id } into t2g
                 select t2g.Key.rate / t2g.Count()
                )
                .SumAsync();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接