Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework GroupBy表达式无法转换_Entity Framework_Entity Framework 6_Ef Core 3.0_.net Core 3.1 - Fatal编程技术网

Entity framework GroupBy表达式无法转换

Entity framework GroupBy表达式无法转换,entity-framework,entity-framework-6,ef-core-3.0,.net-core-3.1,Entity Framework,Entity Framework 6,Ef Core 3.0,.net Core 3.1,更新 似乎这肯定是由于.net core 3.x和EF core在最近的更新后一起使用的方式发生了变化。我不得不使用AsEnumerable()而不是ToListAsync()将其更改为客户端评估。Steve py给出的查询的其余部分使用此方法。我甚至在读了文档之后都不知道groupby在LINQ中是如何工作的,所以这对我帮助很大。但是,将查询转到客户端评估可能会有性能问题。基于此: 我想按TRN分组,这是一组重复的数字,例如12345,在应用程序表中可能有许多具有相同序列的记录,我只想要每组T

更新 似乎这肯定是由于.net core 3.x和EF core在最近的更新后一起使用的方式发生了变化。我不得不使用
AsEnumerable()
而不是
ToListAsync()
将其更改为客户端评估。Steve py给出的查询的其余部分使用此方法。我甚至在读了文档之后都不知道groupby在LINQ中是如何工作的,所以这对我帮助很大。但是,将查询转到客户端评估可能会有性能问题。

基于此:

我想按TRN分组,这是一组重复的数字,例如12345,在应用程序表中可能有许多具有相同序列的记录,我只想要每组TRN序列中最新的一行

我相信这应该满足您的需求:

InvalidOperationException: The LINQ expression 'DbSet<Application>
.Where(a => a.LastName.ToLower().Contains(__ToLower_0) || a.FirstName.ToLower().Contains(__ToLower_0))
.GroupBy(
source: a => new {
TRN = a.TRN,
app = a
},
keySelector: a => a)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync()
GroupBy
表达式应该表示您要按哪些进行分组。在你的情况下,TRN。在这里,当我们进行选择时,
x
表示每个“组”,其中包含属于每个TRN的可枚举应用程序集。因此,我们按CreatedAt日期降序排序,使用
First
选择最新的一个


试试看。如果它不是你所追求的,请考虑在你的问题中添加一个示例集,以及期望的输出与这里产生的输出/错误。

我经历了一个类似的问题,我发现它同时又有趣又愚蠢。似乎英孚团队禁止做一个WHERE-before组,因此它不起作用。我不明白为什么你不能这样做,但这似乎是迫使我实现过程,而不是很好地构建代码的方式

如果你能找到办法,我会的


注意:只有当您先分组然后执行where(在完整表的分组元素上,where=>对我来说没有任何意义)时,它们才具有group by(分组依据)

编译时或运行时错误?哪一行突出显示?可能会将
.GroupBy(app=>new{app.TRN,app})
更改为
.GroupBy(app=>app.TRN)
?@JohnyL我将错误添加到问题中作为编辑。我确实试过了,但是我需要查询的输出以
List
的形式更改
.GroupBy(app=>new{app.TRN,app})
。GroupBy(app=>app.TRN)
有帮助吗?不,不幸的是,它仍然没有给我正确的结果集。嗯,也许我应该用另一种方式来解决这个问题。我想按TRN分组,这是一组重复的数字,例如12345,在应用程序表中可能有许多具有相同序列的记录,我只想要每组TRN序列中最新的一行。因此,如果表中有3行带有该TRN,我只希望返回最后插入的行。这就是我试图为每一组不同的TRN编号实现的目标。我回滚了你上一次的修订,因为它将问题变成了一个新的问题,不尊重现有的答案。事实上,你帮我解释了groupby,我没有按照组是实际的“组”项目的思路思考。我将尝试一下,并报告结果
无法翻译。要么以可以翻译的形式重写查询,要么显式地切换到客户机求值
,这是我在尝试按概述的方式运行查询时遇到的错误片段。我正在使用.net core 3.0,目前不确定这是否与此有关。该错误表明表达式中存在EF core无法转换为SQL的内容。我认为这可能是EF Core 3中的一个突破性变化,因为我已经测试了EF Core 2.6和EF 6中的一个表达式,它们可以很好地转换。如果将SQL Server作为数据库运行,则不需要额外的ToLower()来进行字符串比较,前提是使用了默认的不区分大小写的排序规则。我尝试将我的测试项目从2.6更新到3.0,但由于modelbuilder中的一些突破性更改,它对我的实体配置产生了刺耳的影响。EF核心团队是一个功能失调的团队…你能试试
.Where(app=>app.LastName.Contains(name)| | app.FirstName.Contains(name))
。我知道这不是一个理想的解决方案,因为它会对排序进行假设,但它可能会确认或否认问题所在。为了添加,使用Core 2.6生成的原始
ToLower
语句导致:
where(CHARINDEX(@u-ToLower\u 0,LOWER([x].[Name])>0)或(@u-ToLower\u\u\u 0=N''),
,没有客户评估。因此,这可能是核心3的一个怪癖,或者某种程度上是特定于您的示例的。或者(如果您能承受),在筛选后选择内存中的所有内容,并将其分组到内存中。我不喜欢将所有数据从SQL端传输到客户端,因为这会导致太多的数据流,并降低所有速度。
InvalidOperationException: The LINQ expression 'DbSet<Application>
.Where(a => a.LastName.ToLower().Contains(__ToLower_0) || a.FirstName.ToLower().Contains(__ToLower_0))
.GroupBy(
source: a => new {
TRN = a.TRN,
app = a
},
keySelector: a => a)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync()
return await _context.Application
    .AsNoTracking()
    .Include(app => app.BranchIssued)
    .Include(app => app.BranchReceived)
    .Include(app => app.Parish)
    .Where(app => app.LastName.ToLower().Contains(name.ToLower()) || app.FirstName.ToLower()
    .Contains(name.ToLower()))
    .GroupBy(app => app.TRN)
    .Select(x => x.OrderByDescending(y => y.CreatedAt).First())
    .ToListAsync()
    .ConfigureAwait(false);