EF Core 3 GroupBy 多列 Count Throws 与扩展但 linq 有效

Sev*_*Der 5 entity-framework ef-core-3.0 .net-core-3.1

这是引发完整异常的一个:

            var duplicateCountOriginal = _db.TableName
                                .GroupBy(g => new {g.ColumnA, g.ColumnB, g.ColumnC})
                                .Count(g => g.Count() > 1);
Run Code Online (Sandbox Code Playgroud)

异常: System.ArgumentException:“System.Func 2[System.Linq.IGrouping2[Microsoft.EntityFrameworkCore.Storage.ValueBuffer,Microsoft.EntityFrameworkCore.Storage.ValueBuffer],Microsoft.EntityFrameworkCore.Storage.ValueBuffer]”类型的表达式不能用于“System”类型的参数.Func 2[Microsoft.EntityFrameworkCore.Storage.ValueBuffer,Microsoft.EntityFrameworkCore.Storage.ValueBuffer]' of method 'System.Collections.Generic.IEnumerable1[Microsoft.EntityFrameworkCore.Storage.ValueBuffer] Select[ValueBuffer,ValueBuffer](System.Collections.Generic.IEnumerable 1[Microsoft.EntityFrameworkCore.Storage.ValueBuffer], System.Func2[Microsoft.EntityFrameworkCore.Storage.ValueBuffer,Microsoft.EntityFrameworkCore.Storage.ValueBuffer])'(参数'arg1 ')

但是当它被写成 linq 时,同样的事情也有效(我更喜欢扩展)

            var duplicateCount =
                    from a in _db.TableName
                    group a by new {a.ColumnA, a.ColumnB, a.ColumnC}
                    into g
                    where g.Count() > 1
                          select g.Key;
            duplicateCount.Count()
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么一个有效或另一个无效。此外,如果我根据 EF Core 3 更改稍微更改第一个,如下所示

            var duplicateCountOriginal = _db.TableName
                                .GroupBy(g => new {g.ColumnA, g.ColumnB, g.ColumnC})
                                .AsEnumerable()
                                .Count(g => g.Count() > 1);
Run Code Online (Sandbox Code Playgroud)

我收到以下异常System.InvalidOperationException:客户端投影包含对“Microsoft.EntityFrameworkCore.Metadata.IPropertyBase”常量表达式的引用,该表达式作为参数传递给方法“TryReadValue”。这可能会导致内存泄漏。考虑将此常量分配给局部变量并在查询中使用该变量。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2103067

在我看来,ms 给出的链接对这里的任何问题都没有意义。

如果有任何合乎逻辑的解释,请 LMK。

Iva*_*oev 7

没有合乎逻辑的解释。仅 EF Core 查询翻译还远非完美,并且存在许多缺陷/错误/未处理的情况。

在这种特殊情况下,问题不在于查询语法或方法语法(您称之为扩展),而是缺少Selectafter GroupBy。如果您重写类似于使用查询语法的方法语法查询,即 add .Where.Select然后Count

var duplicateCount = _db.TableName
    .GroupBy(g => new {g.ColumnA, g.ColumnB, g.ColumnC})
    .Where(g => g.Count() > 1)
    .Select(g => g.Key)
    .Count();
Run Code Online (Sandbox Code Playgroud)

那么它将被成功翻译和执行。