EF Core Group By 翻译支持条件总和

EF Core Group By translation support on conditional sum

听说 EF Core 2.1 将支持翻译组,我真的很兴奋。我下载了预览版并开始测试,但发现我在很多地方仍然无法按翻译分组。

在下面的代码片段中,对 TotalFlagCases 的查询将阻止按翻译分组的工作。无论如何,我可以重写这个以便我可以得到支持吗?或者我可以采取另一种方法?

此 table 中有很多行,我不希望 .NET 必须加载所有这些行。我也使用行级数据,但一次只有大约 15 条记录。

var headerTask = (from c in cases
    group c by 1
    into g
    select new CaseHeader
    {
        TotalCases = g.Count(),
        // ... A number of other aggregates
        TotalFlagCases = g.Where(a => a.Flag).Sum(b => 1),
    })
.DefaultIfEmpty(new CaseHeader()).FirstAsync();

有一种方法可以在此版本的 EF Core 中进行条件求和。提供的代码不会被翻译成所需的 SQL 和 GROUP BY 但也许未来的版本会以这种方式支持它。现在你可以尝试这样的事情:

var headerTask = cases
    .Select(c => new
    {
        c.Flag,
        c.YourKey,
        //other properties
    })
    .GroupBy(c => c.YourKey, (k, g) => new CaseHeader
    {
        TotalCases = g.Count(),
        // ... A number of other aggregates
        TotalFlagCases = g.Sum(b => a.Flag ? 1 : 0)
    });

当您将您的实体投影为匿名类型,然后将其分组并在聚合函数中使用条件运算符时,它将被转换为 SQL 和 GROUP BY 以及如下聚合:

SELECT COUNT(*) AS [TotalCases], SUM(CASE
    WHEN [c].[Flag] = 1
    THEN 1 ELSE 0
END) AS [TotalFlagCases]
FROM [Cases] AS [c]
GROUP BY [c].[YourKey]

当你不将它投影到匿名类型时,当缺少上述 Select 函数时,它不会被翻译成 SQL 和 GROUP BY。看起来这个预发行版的查询翻译器不支持它或者它是一个错误。