DotNetNuke用户角色查询需求:获取角色名称及多角色处理方案
我来帮你搞定这个DNN用户角色查询的问题!你原来的查询只拿到RoleID是因为没关联Roles表,而且多角色的情况也可以通过聚合函数来灵活展示,下面分两种常用场景给你解决方案:
1. 获取用户+对应角色名称(每行一个角色)
如果需要清晰看到用户的每个角色单独一行,只需要在原查询基础上关联Roles表,取出RoleName字段即可:
SELECT Users.FirstName, Users.LastName, Users.Email, Roles.RoleName FROM UserRoles INNER JOIN Users ON UserRoles.UserID = Users.UserID INNER JOIN Roles ON UserRoles.RoleID = Roles.RoleID
这样每个用户的每个角色都会生成一条独立记录,比如一个用户关联3个角色,就会返回3行对应数据。
2. 合并同一用户的多个角色到单个字段
如果想把同一个用户的所有角色用分隔符(比如逗号)合并成一个字段,不同数据库的写法略有差异,这里针对DNN常用的SQL Server给出两种方案:
方案A:SQL Server 2017及以上版本(推荐)
用STRING_AGG函数直接聚合角色名称,写法简洁高效:
SELECT Users.FirstName, Users.LastName, Users.Email, STRING_AGG(Roles.RoleName, ', ') AS AssignedRoles FROM UserRoles INNER JOIN Users ON UserRoles.UserID = Users.UserID INNER JOIN Roles ON UserRoles.RoleID = Roles.RoleID GROUP BY Users.UserID, Users.FirstName, Users.LastName, Users.Email
方案B:SQL Server 2016及更早版本
如果你的数据库版本不支持STRING_AGG,可以用STUFF+FOR XML PATH的组合来实现拼接:
SELECT u.FirstName, u.LastName, u.Email, -- 拼接角色名称并去掉开头多余的分隔符 STUFF(( SELECT ', ' + r.RoleName FROM UserRoles ur INNER JOIN Roles r ON ur.RoleID = r.RoleID WHERE ur.UserID = u.UserID FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS AssignedRoles FROM Users u -- 用LEFT JOIN可以包含没有任何角色的用户,不需要的话换成INNER JOIN LEFT JOIN UserRoles ur ON u.UserID = ur.UserID GROUP BY u.UserID, u.FirstName, u.LastName, u.Email
如果是MySQL环境,只需要把STRING_AGG换成GROUP_CONCAT(Roles.RoleName SEPARATOR ', ')就能实现类似的合并效果。
内容的提问来源于stack exchange,提问作者Tig7r
相关产品推荐
相关产品推荐

