Entity framework EF Core 3 GroupBy多列计数抛出扩展,但linq有效

Entity framework EF Core 3 GroupBy多列计数抛出扩展,但linq有效,entity-framework,ef-core-3.0,.net-core-3.1,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); 例外情况: System.ArgumentExcep

下面是引发完全异常的一个:

            var duplicateCountOriginal = _db.TableName
                                .GroupBy(g => new {g.ColumnA, g.ColumnB, g.ColumnC})
                                .Count(g => g.Count() > 1);
例外情况: System.ArgumentException:System.Func
2[System.Linq.iGroup
2[Microsoft.EntityFrameworkCore.Storage.ValueBuffer,Microsoft.EntityFrameworkCore.Storage.ValueBuffer],Microsoft.EntityFrameworkCore.Storage.ValueBuffer]类型的表达式不能用于System.Func
2类型的参数[Microsoft.EntityFrameworkCore.Storage.ValueBuffer,Microsoft.EntityFrameworkCore.Storage.ValueBuffer]'of方法'System.Collections.Generic.IEnumerable
1[Microsoft.EntityFrameworkCore.Storage.ValueBuffer]选择[ValueBuffer,ValueBuffer](System.Collections.Generic.IEnumerable
1[Microsoft.EntityFrameworkCore.Storage.ValueBuffer],System.Func
2[Microsoft.EntityFrameworkCore.Storage.ValueBuffer,Microsoft.EntityFrameworkCore.Storage.ValueBuffer])(参数“arg1”)

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

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

            var duplicateCountOriginal = _db.TableName
                                .GroupBy(g => new {g.ColumnA, g.ColumnB, g.ColumnC})
                                .AsEnumerable()
                                .Count(g => g.Count() > 1);
我得到了以下异常: SudioPurtualExtExist:Client投影包含引用“微软.EntyTrrasWorkCudi.MealPrimeBasic”的常量表达式,该参数作为参数传递给方法“TryRealValue'”。这可能会导致内存泄漏。请考虑将此常量赋值给本地变量,并使用查询中的变量。有关更多信息,请参阅

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


如果有任何逻辑解释,请联系我们。

没有逻辑解释。Just EF Core查询翻译还远远不够完美,存在许多缺陷/bug/未处理的情况

在这种情况下,问题不在于查询语法或方法语法(您称之为扩展),而在于在
GroupBy
之后缺少
Select
。如果您重写方法语法查询,与使用查询语法的查询类似,即添加
。其中
。选择
,然后
计数

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

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

虽然这不是一个等价的查询。@DavidBrowne Microsoft只是出于好奇,为什么不呢?我的错,它是一样的。我有点理解这一点(从EF的角度来看仍然很愚蠢),当groupby作为第一项时,您确实无法先筛选然后再分组。因此,如果我想先筛选出一些数据(在sql端),然后再在sql端分组,这是不可能的。基于此,您必须先对整个表进行分组,然后再处理分组结果。(倒置)[与我或你的示例无关]_db.T1.Where(s=>s.A==“1”和&s.B==“A”).GroupBy(s=>s.C)。选择(s=>newx{P1=s.Count(q=>q.M!=“C”),P2=s.Count(q=>q.M==“C”),P3=0})。FirstOrDefaultAsync();作为一个例子。我知道这有点复杂,但在客户端计算这些值真的很荒谬。
var duplicateCount = _db.TableName
    .GroupBy(g => new {g.ColumnA, g.ColumnB, g.ColumnC})
    .Where(g => g.Count() > 1)
    .Select(g => g.Key)
    .Count();