执行LINQ to Entities查询获取最新RegistrationNumber时返回空数据求原因
问题分析与解决方案
首先,咱们来拆解下你当前查询的问题:
你已经用Where(g => g.GroupId == id)过滤出了指定组的所有书籍,这时候再调用GroupBy(g => g.GroupId)其实是多余的——因为结果里只会有一个分组(对应你指定的id)。而且你的查询只完成了分组操作,没有从分组里提取你需要的RegistrationNumber,这就是你拿到空结果的核心原因。
针对单个GroupId的正确写法
既然你只需要获取特定GroupId对应的最新RegistrationNumber,完全不需要分组操作,直接按以下逻辑实现即可:
- 过滤出目标组的所有书籍
- 按
RegistrationNumber降序排序(最新的条目会排在最前面) - 提取第一个元素的
RegistrationNumber
对应的代码如下:
var latestRegistrationNumber = _context.Books .Where(book => book.GroupId == id) .OrderByDescending(book => book.RegistrationNumber) .Select(book => book.RegistrationNumber) .FirstOrDefault();
FirstOrDefault()会返回排序后的第一个值(也就是你要的最新注册号);如果该组没有任何书籍,会返回对应类型的默认值(比如null,具体取决于RegistrationNumber的字段类型)。
如果需要批量获取所有组的最新注册号
如果你之后有需求要一次性获取每个组的最新注册号,那分组的正确写法应该是:先按GroupId分组,再在每个分组内部找到最大的RegistrationNumber:
var groupLatestRegistrations = _context.Books .GroupBy(book => book.GroupId) .Select(group => new { GroupId = group.Key, LatestRegistrationNumber = group .OrderByDescending(book => book.RegistrationNumber) .Select(book => book.RegistrationNumber) .FirstOrDefault() });
这样你就能得到一个包含每个组ID和对应最新注册号的集合了。
内容的提问来源于stack exchange,提问作者mcfred
相关产品推荐
相关产品推荐

