C# 使用ASP.NET标识检索多个用户,包括他们在EF Core中的角色
我正在尝试检索多个用户,包括他们的角色。这是在一个论坛中使用的,我想在这里展示对该线程发表评论的用户的角色。我见过许多使用C# 使用ASP.NET标识检索多个用户,包括他们在EF Core中的角色,c#,asp.net-core,asp.net-identity,entity-framework-core,C#,Asp.net Core,Asp.net Identity,Entity Framework Core,我正在尝试检索多个用户,包括他们的角色。这是在一个论坛中使用的,我想在这里展示对该线程发表评论的用户的角色。我见过许多使用UserManager和rolemanger检索单个IdentityUser角色的示例,但是如上所述,我有多个用户希望检索 我尝试将角色作为属性包含在用户上,如下所示: public virtual ICollection<IdentityUserRole<string>> Roles { get; set; } 我前几天才遇到这个问题。我在Appl
UserManager
和rolemanger
检索单个IdentityUser
角色的示例,但是如上所述,我有多个用户希望检索
我尝试将角色作为属性包含在用户上,如下所示:
public virtual ICollection<IdentityUserRole<string>> Roles { get; set; }
我前几天才遇到这个问题。我在
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)
});
公共类CommentViewModel
{
公共虚拟注释{get;set;}
公共虚拟用户配置文件用户{get;set;}
公共虚拟ICollection角色{get;set;}
}
var注释=(
来自c in_context.Comments
在c.UserId等于u.Id上的_context.UserProfiles中加入u
选择new CommentViewModel
{
注释=c,
用户=u,
角色=(
从ur in_context.UserRoles
在ur.RoleId上的_context.Roles中加入r等于r.Id
其中ur.UserId==u.Id
选择(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));
这并不容易,但您可以将所有这些代码分解成某种映射实用程序类,然后返回一个“用户”视图模型列表,其中已经附加了角色。这是否会迫使我手动映射我的
注释
实体上的每个属性?这只是为了吸引用户,但我不确定如何映射我的注释
实体您可以设置一个将注释作为属性的viewmodel,这样您只需要映射对象,而不需要映射其所有底层道具。我觉得奇怪的是,我无法使用简单的lambda表达式和EF fluent API找到任何解决方案,而不是使用LINQ查询检索所有数据。
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));