9

听到 EF Core 2.1 将支持翻译组,我真的很兴奋。我下载了预览版并开始对其进行测试,但发现在许多地方我仍然没有按翻译分组。

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

此表中有很多行,我不希望 .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();
4

1 回答 1

14

在此版本的 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缺少上述函数时,它将不会被转换为带有GROUP BY. 看起来这个预发行版的查询翻译器不支持它或者它是一个错误。

于 2018-05-04T15:19:09.407 回答