You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 09:07:35