【问题标题】:ASP.NET Core 1.1 getting all users and their rolesASP.NET Core 1.1 获取所有用户及其角色
【发布时间】:2017-09-19 14:29:33
【问题描述】:

我是 .NET 的新手,我试图获取所有注册用户的列表及其角色名称,并使用 viewModel 将它们发送到视图。

这是视图模型:

public class ApplicationUserListViewModel
{
    [Display(Name = "User Email Address")]
    public string UserEmail { get; set; }

    public  List<IdentityUserRole<string>> Roles { get; set; }
}

我尝试这样做是为了获取所有用户及其角色,并为每个用户创建一个 ViewModel,并将所有视图模型放在一个列表中以传递给 View:

var users =  _userManager.Users.ToList();
var userList = users.Select(u => 
                new ApplicationUserListViewModel {
                    UserEmail = u.Email,
                    Roles = u.Roles.ToList() }
                    ).ToList(); 

但是当我清楚地为每个用户分配了角色时,这总是给我每个用户的角色计数为 0。

【问题讨论】:

  • _userManager.Users.Include(u =&gt; u.Roles)

标签: c# asp.net-mvc entity-framework asp.net-identity


【解决方案1】:

您自己解决了问题,但您的解决方案并不完美,因为它会导致性能问题。您正在对数据库执行一个请求以查询用户,然后在 foreach 循环中为每个用户执行一个新查询以获取他们的相关角色,这非常糟糕。如果您的数据库中有 X 用户,您最终将使用:

  • 一个查询获取用户
  • X 次查询以获取每个用户的角色。

您可以通过在一个查询中包含相关角色来做得更好,如下所示:

foreach (var user in _userManager.Users.Include(u => u.Roles).ToList())
{              
    list.Add(new ApplicationUserListViewModel {
        UserEmail = user.Email,
        Roles = user.Roles
    });
}

或者只是这样:

var users = _userManager.Users.Include(u => u.Roles)
                        .Select(u => new ApplicationUserListViewModel {
                            UserEmail = user.Email,
                            Roles = user.Roles
                        })
                        .ToList();

ASP.NET Core Identity 2.x 更新

此解决方案对 ASP.NET Core Identity 2.x 无效,因为 IdentityUser 不再包含 Roles 属性。请参阅 this answer 了解 ASP.NET Core Identity 2.x。

【讨论】:

    【解决方案2】:

    嗯,我得到了这个工作。这可能不应该这样做,但它工作正常。

    var list = new List<ApplicationUserListViewModel>();
    
    foreach (var user in _userManager.Users.ToList())
    {              
        list.Add(new ApplicationUserListViewModel() {
            UserEmail = user.Email,
            Roles = await _userManager.GetRolesAsync(user)
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-28
      • 1970-01-01
      • 2023-04-04
      • 2016-12-26
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多