Voglio che tutti gli utenti con i loro ruoli siano raggruppati in base al loro nome e includano anche utenti che non hanno alcun ruolo.
Sto usando l'identità di asp.net 2 finora ho provato
from user in users
from identityUserRole in user.Roles
join identityRole in identityRole on identityUserRole.RoleId equals identityRole.Id into r
from roles in r
group roles.Name by user.UserName into g
select new
{
UserName = g.Key,
Roles = g.ToList()
};
Ma questo restituisce solo gli utenti che hanno un ruolo ..
Preferisco usare un modello per mappare i dati:
public class UserDto
{
public string UserName { set; get; }
public List<string> Roles { set; get; }
}
e quindi ottenere tutti gli utenti e i relativi nomi di ruolo in questo modo:
var users = (from u in db.Users
let query = (from ur in db.Set<IdentityUserRole>()
where ur.UserId.Equals(u.Id)
join r in db.Roles on ur.RoleId equals r.Id
select r.Name)
select new UserDto { UserName = u.UserName, Roles = query.ToList() })
.ToList();
Potresti anche semplificare la tua query a questo.
var userAndRoles = users.Select(user => new
{
UserName = user.UserName,
Roles = roles.Where(role => user.Roles.Any(userRole => userRole.UserId == user.UserId && userRole.RoleId == role.RoleId))
});