ASP.NET Core 1.1 getting all users and their roles

asp.net-identity asp.net-mvc c# entity-framework

Question

I am new to .NET trying to get a list of all the registered user along with their role names and send them to a view using a viewModel.

Here's the ViewModel:

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

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

I tried this for getting all users along with their roles and make a ViewModel for each user and put all the view models in a list to pass to the View:

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

But this always gives me 0 roles count for every user when I clearly have roles assigned to every user.

1
7
4/22/2017 5:11:55 PM

Accepted Answer

You anwsered yourself but your solution is not perfect because it causes performance issue. You're executing one request to your database to query users then in your foreach loop you execute a new query for each user to get their related roles which is really bad. If you've X user in your database you will end up using :

  • One query to get users
  • X queries to get each user's roles.

You can do better by including the related roles in one query like this:

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

Or just this:

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

Update for ASP.NET Core Identity 2.x

This solution is not valid for ASP.NET Core Identity 2.x as IdentityUser no longer contains a Roles property. See this answer for ASP.NET Core Identity 2.x.

10
6/23/2018 10:23:35 PM

Popular Answer

Well, I got this working. This is probably not how it should be done but it works fine.

var list = new List<ApplicationUserListViewModel>();

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


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow