EF Core groupBy 没有 SQL 空合并运算符 (??) 的翻译。执行 ??0m 时未使用 ISNULL 进行翻译

EF Core groupBy no SQL translation for null-coalescing operator (??). ISNULL is not being used to translate when doing ??0m

将 EF Core 2.2 与

结合使用
optionsBuilder.ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));

工作组通过 linq 查询 sql 服务器数据库无法通过将 Select(t=>t.Value) 更改为 Select(t=>t.Value??0m) 在服务器端进行评估。

为什么它不被翻译成 SQL 因为它可能变成 SUM(ISNULL(Value,0)) ?

我知道这不是必需的,但我想了解它是如何在引擎盖下工作的,因为我觉得我遗漏了一些东西。

这是 EF Core 2.2 GroupBy 查询转换器 defect/limitation(已在 EF Core 3.x 中修复),除了简单的 "property" 访问外,它不支持聚合方法表达式.

解决方法是使用包含所有必需表达式(因此它们变成 "properties")的中间(匿名类型)投影,使用带有元素选择器的 GroupBy 重载。

例如,给定这样的实体:

public class SomeEntity
{
    public int Id { get; set; }
    public int SomeKey { get; set; }
    public decimal? SomeValue { get; set; }
}

需要,但 EFC2.2 查询失败,如下所示:

var query = db.Set<SomeEntity>()
    .GroupBy(e => e.SomeKey)
    .Select(g => new
    {
        g.Key,
        Value = g.Sum(e => e.SomeValue ?? 0m) // <--
    });

修改后的工作 EFC2.2 解决方案可能是这样的:

var query = db.Set<SomeEntity>()
    .GroupBy(e => e.SomeKey, e => new { SomeValue = e.SomeValue ?? 0m }) // <--
    .Select(g => new
    {
        g.Key,
        Value = g.Sum(e => e.SomeValue) // <--
    });

更通用的解决方案是将空合并运算符移出聚合函数:

var query = db.Set<SomeEntity>()
    .GroupBy(e => e.SomeKey)
    .Select(g => new
    {
        g.Key,
        Value = g.Sum(e => e.SomeValue) ?? 0m // <--
    });