在.NET Core 3.1的EF Core中,如何结合ViewModel正确填充PageGroup关联Page的数量属性?
解决PageCount始终为0的问题
你遇到的问题核心是对EF Core的Include方法理解有误——Include是用来加载完整的关联实体集合的,而不是用来统计数量的。你写的Include(p => p.Pages.Count)完全不符合Include的用法,EF Core无法解析这个表达式,所以实际上并没有加载任何关联的Page数据,内存里的pa.Pages是空集合,Count自然就是0了。
下面给你两种正确的解决方式,优先推荐第一种:
方式一:直接在数据库层面统计数量(性能最优)
不需要加载整个Pages集合,让EF Core生成SQL的COUNT语句直接在数据库统计,这样性能最好,尤其是数据量较大时:
public async Task<IEnumerable<ShowGroupsViewModel>> GetListGroupsServiceAsync() { return await _context.PageGroups .Select(pa => new ShowGroupsViewModel() { GroupID = pa.GroupID, GroupTitle = pa.GroupTitle, PageCount = pa.Pages.Count() // 这里用Count()方法,EF会转成SQL的COUNT统计 }).ToListAsync(); }
方式二:先加载关联集合再统计(适合需要用到Pages数据的场景)
如果你后续业务逻辑需要用到每个PageGroup下的具体Page数据,可以先正确加载关联集合,再统计数量:
public async Task<IEnumerable<ShowGroupsViewModel>> GetListGroupsServiceAsync() { // 先加载完整的PageGroup和关联的Pages集合 var pageGroups = await _context.PageGroups .Include(group => group.Pages) // 正确指定要加载的导航属性 .ToListAsync(); // 转换为ViewModel return pageGroups.Select(group => new ShowGroupsViewModel() { GroupID = group.GroupID, GroupTitle = group.GroupTitle, PageCount = group.Pages.Count }); }
注意事项
- 方式一不需要加载所有
Page数据到内存,数据库直接返回统计结果,是更高效的方案,建议优先使用。 - 在.NET Core 3.1中,EF Core对导航属性的LINQ方法支持已经很完善,
pa.Pages.Count()会被正确转换为SQL的关联统计语句,不用担心语法兼容性问题。
内容的提问来源于stack exchange,提问作者Hossein_Azimi
相关产品推荐
相关产品推荐

