连续获取最大值时如何解决错误(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 => a.ImageId).Distinct().SelectMany(key => _db.History.Where(x => x.ImageKey == key).OrderByDescending(x => 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<Application.Core.Domain.History.HistoryEntry>' to 'System.Collections.Generic.List<Application.Core.Domain.History.HistoryEntry>'. An explicit conversion exists (are you missing a cast?)
在 return 语句的末尾添加 ToList()以上是关于连续获取最大值时如何解决错误(EF Core Linq)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 EF Core 5 中为自定义 SQL 配置导航属性