EF Core 3 分组按多列 计数抛出与扩展但 linq 工作



这是抛出完整异常的那个:

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

例外:System.ArgumentException: 类型为 'System.Func2[System.Linq.IGrouping2[Microsoft.EntityFrameworkCore.Storage.ValueBuffer,Microsoft.EntityFrameworkCore.Storage.ValueBuffer],Microsoft.EntityFrameworkCore.Storage.ValueBuffer]'的表达式不能用于类型为 'System.Func2[Microsoft.EntityFrameworkCore.Storage.ValueBuffer,Microsoft.EntityFrameworkCore.Storage.ValueBuffer]' of method 'System.Collections.Generic.IEnumerable1[Microsoft.EntityFrameworkCore.Storage.ValueBuffer] Select[ValueBuffer,ValueBuffer](System.Collections.Generic.IEnumerable1[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()

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

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

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

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

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

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

在这个特定的情况下,问题不在于查询语法或方法语法(您称之为扩展(,而在于GroupBy后缺乏Select。如果您重写方法语法查询类似于使用查询语法的查询,即添加.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();

然后它将被翻译并成功执行。

最新更新