Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ASP.NET标识检索多个用户,包括他们在EF Core中的角色_C#_Asp.net Core_Asp.net Identity_Entity Framework Core - Fatal编程技术网

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));