如何在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();
逻辑说明:
- 从
_context.Roles获取所有12个角色,作为左表 - 通过左外连接关联
UserRoles表,每个角色会对应一个关联记录的集合(没有用户的角色,这个集合是空的) - 直接统计每个角色对应的关联集合的数量:空集合的
Count()会返回0,完美符合你要的未分配用户角色显示0的需求
额外提醒:
如果你的业务场景中存在同一用户重复关联同一角色的情况(虽然正常不会有),想要统计唯一用户数的话,可以把Count()改成relatedUserRoles.Select(ur => ur.UserId).Distinct().Count(),这样会去重后统计用户数量。
内容的提问来源于stack exchange,提问作者user8107351
相关产品推荐
相关产品推荐

