2017-04-22 148 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) 
      }); 
} 
相關問題