连续获取最大值时如何解决错误(EF Core Linq)? [复制]

Posted

技术标签:

【中文标题】连续获取最大值时如何解决错误(EF Core Linq)? [复制]【英文标题】:How to solve error when getting max value in a row (EF Core Linq)? [duplicate] 【发布时间】:2021-12-20 02:33:10 【问题描述】:

访问具有值的表: Id ImageId Score 。 需要得到每个模拟ImageId的最高分。

例如:

1 a1 10 points
2 a1 30 points
3 b1 15 points

想要:a1 30 points and b1 15 points

使用的代码:

public async Task<List<HistoryEntry>> Handle(Request request, CancellationToken cancellationToken)
                => await _db.History.GroupBy(a => a.ImageId).Select(s => s.OrderByDescending(x => x.Score).First()).ToListAsync();
        

错误:

.OrderByDescending(x => x.Score)' 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 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

InvalidOperationException: The LINQ expression 'GroupByShaperExpression: KeySelector: h.ImageId, ElementSelector:EntityShaperExpression: EntityType: HistoryEntry ValueBufferExpression: ProjectionBindingExpression: EmptyProjectionMember IsNullable: False .OrderByDescending(x => x.Score)' 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 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

【问题讨论】:

希望此功能将随 EF Core 6.0 一起提供,应该很快就会发布。在此之前,请使用链接帖子中的解决方法,在您的情况下类似于 _db.History.Select(a =&gt; a.ImageId).Distinct().SelectMany(key =&gt; _db.History.Where(x =&gt; x.ImageKey == key).OrderByDescending(x =&gt; x.Score).Take(1)) 【参考方案1】:

代码中最简单的方法是更改​​顺序:

var groupedResult  = await _db.History.GroupBy(a => a.ImageId).ToListAsync();
return groupedResult.Select(s => s.OrderByDescending(x => x.Score).First());

EF 无法将此类嵌套查询转换为 SQL - 因此您的错误。在此解决方案中,分组结果在内存中具体化,因此此类嵌套查询不会导致问题。 不过要小心 - 如果数据库中有很多记录,这肯定不是最佳解决方案,但在记录很少的情况下,它会发挥作用。

【讨论】:

我明白了,什么是可选的? 我认为,我会使用 DB 视图,但可能还有其他一些可能性可以仅使用 EF 获取此类数据 实际上我在返回时遇到了一个新错误:Cannot implicitly convert type 'System.Collections.Generic.IEnumerable&lt;Application.Core.Domain.History.HistoryEntry&gt;' to 'System.Collections.Generic.List&lt;Application.Core.Domain.History.HistoryEntry&gt;'. An explicit conversion exists (are you missing a cast?) 在 return 语句的末尾添加 ToList()

以上是关于连续获取最大值时如何解决错误(EF Core Linq)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 添加迁移构建失败

如何在 EF Core 5 中为自定义 SQL 配置导航属性

EF Core - 添加相关实体时出错

使用 EF Core 保存附加实体时如何删除子实体

如何在 EF Core 3.1 中使用脚手架流程更新我的实体 - 执行超时已过期

如何在 EF Core 中按条件获取最新条目?