2017-04-22 87 views
1

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

这里的视图模型:

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

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

我想这对于让所有用户与他们的角色一起,使一个ViewModel为每个用户,并把所有的视图模型的列表传递给视图:

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

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

+0

'_userManager.Users.Include(U =>ü。角色)' –

回答

5

您已经接受了自己,但您的解决方案并不完美,因为它会导致性能问题。您正在对数据库执行一个请求以查询用户,然后在您的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(); 
1

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

List<ApplicationUserListViewModel> list = new List<ApplicationUserListViewModel>(); 

foreach (var user in _userManager.Users.ToList()) 
{    
     list.Add(new ApplicationUserListViewModel() { 
       UserEmail = user.Email, 
       Roles = await _userManager.GetRolesAsync(user) 
      }); 
} 
相关问题