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

如何在C#中实现三表外连接,显示所有角色及用户数(无则为0)

解决C# EF中获取所有角色及对应用户数(含未分配用户的角色)

你的问题根源在于当前代码用的是内连接——它只会保留同时存在于UserRoles和Users中的数据,所以自然拿不到那些没有分配用户的角色。要包含所有角色(哪怕没有关联用户),你需要改用左外连接,从角色表本身出发来关联用户角色关联表。

这里提供两种常用的写法,都能实现你的需求:

写法1:LINQ查询语法

这种写法更直观,贴近SQL的左连接逻辑:

var result = (from role in _context.Roles
              // 左外连接到UserRoles,把每个角色对应的关联记录分组
              join userRole in _context.UserRoles
              on role.Id equals userRole.RoleId into userRoleGroup
              // 直接统计每个分组的记录数,空分组的Count()就是0
              select new UserRoleModel
              {
                  RoleId = role.Id,
                  NoOfUsers = userRoleGroup.Count()
              }).ToList();

写法2:方法链语法

如果你更喜欢流畅的方法调用风格,可以用GroupJoin(它和查询语法里的join ... into是等价的):

var result = _context.Roles
    .GroupJoin(
        _context.UserRoles,
        role => role.Id,          // 角色表的关联键
        userRole => userRole.RoleId, // 用户角色表的关联键
        (role, relatedUserRoles) => new UserRoleModel
        {
            RoleId = role.Id,
            NoOfUsers = relatedUserRoles.Count()
        })
    .ToList();

逻辑说明:

  1. 从_context.Roles获取所有12个角色,作为左表
  2. 通过左外连接关联UserRoles表,每个角色会对应一个关联记录的集合(没有用户的角色,这个集合是空的)
  3. 直接统计每个角色对应的关联集合的数量:空集合的Count()会返回0,完美符合你要的未分配用户角色显示0的需求

额外提醒:

如果你的业务场景中存在同一用户重复关联同一角色的情况(虽然正常不会有),想要统计唯一用户数的话,可以把Count()改成relatedUserRoles.Select(ur => ur.UserId).Distinct().Count(),这样会去重后统计用户数量。

内容的提问来源于stack exchange,提问作者user8107351

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:51:37