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.Func2[System.Linq.iGroup
2[Microsoft.EntityFrameworkCore.Storage.ValueBuffer,Microsoft.EntityFrameworkCore.Storage.ValueBuffer],Microsoft.EntityFrameworkCore.Storage.ValueBuffer]类型的表达式不能用于System.Func2类型的参数[Microsoft.EntityFrameworkCore.Storage.ValueBuffer,Microsoft.EntityFrameworkCore.Storage.ValueBuffer]'of方法'System.Collections.Generic.IEnumerable
1[Microsoft.EntityFrameworkCore.Storage.ValueBuffer]选择[ValueBuffer,ValueBuffer](System.Collections.Generic.IEnumerable1[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();