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
。看起来这个预发行版的查询翻译器不支持它或者它是一个错误。
听说 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
。看起来这个预发行版的查询翻译器不支持它或者它是一个错误。