【问题标题】:Sum on subqueries on EF Core LinqEF Core Linq 中的子查询总和
【发布时间】:2022-02-05 04:19:58
【问题描述】:

我想通过在 sum 查询中输入 subquery 来获得结果。

以下代码在我写入 Sql 时有效。

但在 EF 上,如何在顶部添加另一个选择?

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# 代码不起作用。

错误:

无法对包含 聚合或子查询。

【问题讨论】:

  • 您正在创建许多您没有使用的匿名类型。
  • 您的 SQL 显示为 where t4.FKId = p1.Id 而您的 LINQ 显示为 t4.FKId == t2.Id - 为什么它们不同?同样适用于 SQL c.rate 和 LINQ t3.Rate?

标签: sql-server linq tsql entity-framework-core


【解决方案1】:

根据this answer,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();

【讨论】:

    猜你喜欢
    • 2020-03-29
    • 2017-06-27
    • 2021-09-06
    • 2021-04-27
    • 2020-01-25
    • 2021-02-22
    • 2019-03-27
    • 2020-09-27
    • 1970-01-01
    相关资源
    最近更新 更多