c# - EntityFramework Core Group By 和 Sum
问题描述
有一段时间没有写任何代码了,我正试图通过为我的孩子编写一个小应用程序来跟踪他们在夏天读过的书来摆脱锈迹。DB很简单,只有3个表。1 表示书籍(标题、作者、页面等),1 表示读者姓名,1 是实际阅读日志(他们阅读的每本书 1 行,外键与书表和读者表的关系)。
尝试使用 EntityFramework 核心编写一个查询,该查询将返回阅读器读取的总页数。我可以在 SSMS 中运行它,它工作正常
select r.Name, sum(b.Pages) as PagesRead
from ReadingLog rl
inner join Readers r on rl.ReaderId = r.Id
inner join Books b on rl.BookId = b.Id
where rl.IsActive = 1
group by r.Name
我试着在 EF 中这样写:
var pagesByReader = _context.ReadingLog
.Where(m => m.IsActive)
.GroupBy(m => m.Reader.Name)
.Select(m => new GraphViewModel()
{
Reader = m.Key,
PagesRead = m.Sum(b => b.Book.Pages)
})
.ToList();
但我在运行时收到此错误:).Book.Pages' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估
我想我只是写错了 EF 查询,但我不知道为什么。任何帮助表示赞赏
解决方案
看起来你m.Key
在select
. 使用时GroupBy
,选择中未在 group by 中定义的所有值都必须在聚合函数中。
尝试更改m.Key
为m.Key.First()
推荐阅读
- neo4j - apoc.periodic.commit 不会导致更新
- xpages - 从 xp:dialog 创建文档 - 对象已被删除或回收
- extjs - 无法在 Ext.grid.PagingToolbar Extjs 上绑定存储
- android - 在 Ubuntu 18.04 上缺少适用于 Android 的 Xamarin 文件
- vue.js - vue js app yarn serve 失败,退出代码为 1。?
- node.js - 我应该为每条路线创建新的模式模型文件还是使用已经创建的模式?
- php - Laravel 中 Session::flash() 和 with() 的区别
- javascript - 选定范围识别
- r - 将嵌套列表转换为数据框/数据表
- azure - 天蓝色虚拟机和节点之间的区别