EF核心小组通过对条件总和的翻译支持

时间:2018-05-03 19:59:44

标签: c# entity-framework-core entity-framework-core-2.1

我很高兴听到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();

1 个答案:

答案 0 :(得分:1)

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

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)
    });

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

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转换为SQL。看起来这个预发行版的查询翻译器不支持它,或者它是一个bug。