我试图检索多个用户,包括其角色。这是在论坛中使用的,我想在该论坛上显示对线程发表评论的用户的角色。我已经看到了许多使用UserManager
和RoleManager
检索单个IdentityUser
角色的示例,但是如前所述,我有多个我希望检索的用户。
我尝试在用户上包括作为属性的角色,例如:
public virtual ICollection<IdentityUserRole<string>> Roles { get; set; }
但这似乎不起作用。我尝试跳过多一部分的表格,然后直接将角色实体包含在我的用户中:
:public virtual ICollection<IdentityRole> Roles { get; set; }
也没有区别,仍然行不通。基本上,我只想将角色加入用户,但我不确定如何。
包括IdentityUserRole<string>
属性并检索我的用户,给我以下错误:
未知列'x.userprofile.roles.userid1'在"字段列表"
这是我的选择:
comments = _context.Comments
.Include(x => x.UserProfile)
.Include(x => x.UserProfile.Roles)
.OrderBy(x => x.CreateDate)
.Where(x => x.ThreadId == id && !user.IgnoredUsers.Contains(x.UserProfile.UserName))
.ToPagedList(Constants.PAGER_DEFAULT_SMALL, page);
我前几天遇到了这个问题。我找到了一些资源,说我应该建立关系并在ApplicationUser
对象中建立道具,但我不想走这条路。我最终只是使用linq查询表达式来构建所需的数据。
var usersWithRoles = (
from u in _db.Users
select new
{
Id = u.Id,
Email = u.Email,
Roles = (
from ur in _db.UserRoles
join r in _db.Roles on ur.RoleId equals r.Id
where ur.UserId == u.Id
select r.Name).ToArray()
});
编辑:这假设您想要一系列字符串中的角色名称。如果您在扩展此查询以满足您的需求时遇到困难,只需发表评论,我会尽力帮助您。
编辑:以下查询应更靠近您的用例。我无法测试查询,所以让我知道您是否遇到任何错误
public class CommentViewModel
{
public virtual Comment Comment { get; set; }
public virtual UserProfile User { get; set; }
public virtual ICollection<Role> Roles { get; set; }
}
var comments = (
from c in _context.Comments
join u in _context.UserProfiles on c.UserId equals u.Id
select new CommentViewModel
{
Comment = c,
User = u,
Roles = (
from ur in _context.UserRoles
join r in _context.Roles on ur.RoleId equals r.Id
where ur.UserId == u.Id
select r)
});
您不需要添加角色的导航属性;已经通过IdentityUser
继承在ApplicationUser
上存在。该属性是UserRoles
,它是IdentityUserRole
S的集合,它本身就是代表IdentityUser
和IdentityRole
之间M2M的实体。长而短:
var users = db.Users.Include(x => x.UserRoles).Where(...);
不幸的是,由于IdentityUserRole
没有导航属性,因此没有直接的方法可以在此处真正获得角色。结果,您需要一个单独的查询才能获得角色:
var usersRoleIds = users.SelectMany(x => x.UserRoles).Select(x => x.RoleId);
var usersRoles = db.Roles.Where(x => userRoleIds.Contains(x));
最后,您可以通过以下方式获得任何一个特定用户的角色:
var specificUserRoles = usersRoles.Where(x => specificUser.UserRoles.Select(r => r.RoleId).Contains(x.Id));
它不是完全 easy ,但是您可以将所有这些代码分解为某种映射实用程序类,并且只需返回带有已附加角色的"用户"视图模型的列表。