web-dev-qa-db-fra.com

ASP.NET Core 1.1 obtenant tous les utilisateurs et leurs rôles

Je suis nouveau sur .NET en essayant d'obtenir une liste de tous les utilisateurs enregistrés avec leurs noms de rôles et de les envoyer à une vue à l'aide d'un viewModel.

Voici le ViewModel:

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

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

J'ai essayé ceci pour obtenir tous les utilisateurs avec leurs rôles et créer un ViewModel pour chaque utilisateur et mettre tous les modèles de vue dans une liste à transmettre à la vue:

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

Mais cela me donne toujours 0 nombre de rôles pour chaque utilisateur lorsque des rôles sont clairement attribués à chaque utilisateur.

5
ravi kumar

Vous vous êtes interrogé mais votre solution n'est pas parfaite car elle pose des problèmes de performances. Vous exécutez une requête dans votre base de données pour interroger des utilisateurs, puis dans votre boucle foreach, vous exécutez une nouvelle requête pour que chaque utilisateur obtienne ses rôles associés, ce qui est vraiment mauvais. Si vous avez un utilisateur X dans votre base de données, vous finirez par utiliser:

  • Une requête pour obtenir des utilisateurs
  • X requêtes pour obtenir les rôles de chaque utilisateur.

Vous pouvez faire mieux en incluant les rôles associés dans une requête comme celle-ci:

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

Ou simplement ceci:

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

Mise à jour pour ASP.NET Core Identity 2.x

Cette solution n'est pas valide pour ASP.NET Core Identity 2.x car IdentityUser ne contient plus une propriété Roles. Voir cette réponse pour ASP.NET Core Identity 2.x.

9
CodeNotFound

Eh bien, ça marche. Ce n'est probablement pas comme cela que cela devrait être fait mais cela fonctionne bien.

var list = new List<ApplicationUserListViewModel>();

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