jar*_*mey 9 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();
Run Code Online (Sandbox Code Playgroud)
are*_*yla 13
在此版本的 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)
});
Run Code Online (Sandbox Code Playgroud)
当您将实体投影到匿名类型中,然后将其分组并在聚合函数中使用条件运算符时,它将被转换为 SQLGROUP 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]
Run Code Online (Sandbox Code Playgroud)
当您不将其投影为匿名类型时,因此当Select缺少上述函数时,它不会被转换为带有GROUP BY. 看起来这个预发布的查询翻译器不支持它或者它是一个错误。