EF Core 6:按组选最新元素并投影转换遇翻译错误求助
解决EF Core 6中LINQ查询翻译错误问题
你遇到的ProjectionBindingExpression: 0翻译错误,是因为EF Core 6无法将你原有的GroupBy + 内部排序取第一条的写法正确转换成SQL语句。以下是可行的解决方案:
正确实现代码
使用EF Core支持的窗口函数RowNumber来实现“每个评论者最新评论”的逻辑,这种写法能被EF Core正确翻译:
var latestComments = Comments .Where(comment => comment.PostId == postId) // 生成窗口函数,按评论者分组,修改时间降序排序 .Select(comment => new { comment.Id, comment.Message, comment.CommenterName, comment.ModificationTime, RowNum = EF.Functions.RowNumber() .Over(partitionBy: comment.CommenterName, orderBy: comment.ModificationTime descending) }) // 筛选每个评论者的第一条(最新)评论 .Where(r => r.RowNum == 1) // 投影成需要的结构,用于后续合并分页 .Select(r => new { r.Id, r.Message }) .ToList();
关键说明
- 窗口函数
RowNumber().Over()会按CommenterName分区,每个分区内按ModificationTime降序生成序号,序号为1的就是该评论者的最新评论。 - 注意你的实体类字段是
ModificationTime,但原代码中写了ModificationTimeUnixTimeInMs,需确保字段名一致,避免编译错误。 - 这个查询的结果结构和你另一张表的查询结果匹配,可以直接用
Concat合并后执行分页:
var otherTableQuery = ...; // 另一张表返回{Id, Message}结构的查询 var combinedResult = latestComments.Concat(otherTableQuery) .Skip(pageSize * (pageIndex - 1)) .Take(pageSize) .ToList();
内容的提问来源于stack exchange,提问作者AmitHaritan
相关产品推荐
相关产品推荐

