我正在使用ASP.NET MVC Default项目。在那里,我们有一个名为 AspNetRoles 的数据库(定义管理员,用户等角色)
然后有一个名为 AspNetUsers 的数据库,它只是在您注册用户时定义用户
最后也是最重要的是 AspNetUserRoles 。当您将角色分配给用户时,它就在这里放置(并且Id是经过哈希处理的)
我的问题是,如何获得系统中每个用户及其角色的列表?我无法弄清楚如何开始这样做。我应该创建自己的用户和角色数据库而忘记默认数据库吗?或者有没有一种使用默认创建的方法?
另外,我会记住,截至目前我正在分配角色 注册(默认情况下是用户)以及稍后我创建索引所在的位置 我显示了用户和角色列表,我想编辑它们,但是这个 只是一个免责声明。 非常感谢您提供任何类型的帮助。
答案 0 :(得分:2)
没有内置方法可以检索具有角色的用户列表,因此您可以尝试获取用户及其角色,如下所示(使用EF):
var list = context.Users
.Where(x => x.Roles.Select(a => a.Id))
.ToList();
使用此功能可以获得每个用户和指定的角色。
<强>更新强> 首先创建如下的模型:
public class UserRoleInfo
{
public ApplicationUser User { set; get; }
public List<string> Roles { set; get; }
}
然后你的查询就像(查询语法):
var listOfUsers = (from u in db.Users
let query = (from ur in db.Set<IdentityUserRole>()
where ur.UserId.Equals(u.Id)
join r in db.Roles on ur.RoleId equals r.Id select r.Name)
select new UserRoleInfo() {User = u, Roles = query.ToList<string>()})
.ToList();
上面的查询将返回每个用户的角色,无论多少。
<强>更新强>
您的观点如下:
@model UserRoleInfo
<table>
<tbody>
@foreach (var user in Model)
{
var appUser = user.ApplicationUser;
var roles = user.Roles;
<tr>
<td>
@appUser.Email
</td>
<td>
@string.Join(",", roles)
</td>
</tr>
}
</tbody>
</table>
答案 1 :(得分:-1)
我建议采用这种方式,因为这会将所有用户从数据库返回为一个列表,其各自的角色附加在用户对象中。 此外,它使用热切加载Roles实体,因此它将转换为数据库中的连接。
如果您只想让一个用户及其角色在where
条件下添加并按其ID过滤。
var users = _applicationDbContext.Users.Include(x => x.Roles).ToList();
foreach (var applicationUser in users)
{
var userRoles = applicationUser.Roles;
//Do something with this user roles
}
答案 2 :(得分:-4)
获取系统中每个用户及其角色的列表:
SELECT UserRoleId, UserId, RoleId, dbo.GetRoleName(RoleId) AS RoleName
FROM dbo.UserRoles
功能:dbo.GetRoleName -
function [dbo].[GetRoleName](@input int)
Returns Nvarchar(500)
As
Begin
Declare @RoleName nvarchar(500)
Set @RoleName=(select Name from Roles where RoleId=@input)
return @RoleName
End