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.
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:
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();
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.
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)
});
}