Search code examples
c#functionasp.net-mvc-5asp.net-identity-2

Controller Code to Loop Through Roles and Get First Letter of Role MVC 6


Here is my UserViewModel:

public class UserViewModel
{
    public string UserId { get; set; }
    public string Email { get; set; }
    public string Roles { get; set; }
}

The line, "Roles=RolePrefixes(u.Id)" is red. I have tried everything to simply call the darn function. In my controller, how do I call the RolePrefixes(string id) function? I say "function" because I don't know what to say.

  private List<UserViewModel> GetUsers()
    {

      var UserManager =  _serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
        var RoleManager = _serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
        var allRoles = RoleManager.Roles.ToList();
        //var user = UserManager.FindByIdAsync(userID);
        //var usersRoles = UserManager.GetRolesAsync(user);

        return context.Users.Select(u => new UserViewModel
        {
            Email = u.Email,
            UserId = u.Id,

           // THIS WORKS FOR Role Ids but not their Names::: Roles = String.Join("/", u.Roles.Select(r => r.RoleId.First()))


           Roles = RolePrefixes(u.Id) //THIS IS UNDERLINED IN RED.

        }).ToList();

    }


    public async Task<string> RolePrefixes(string id)
    {
        var UserManager = _serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
        //var RoleManager = _serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
        //var allRoles = RoleManager.Roles.ToList();
        var user = await UserManager.FindByIdAsync(id);
        var usersRoles = await UserManager.GetRolesAsync(user);

        string strPrefixes = "";
        foreach (var item in usersRoles)
        {
            strPrefixes += item + "/";

        }

        return strPrefixes;

    }

Solution

  • Project the role name, select the first character from the string, and join them all together.

    return context.Users.Select(u => new UserViewModel
    {
        Email = u.Email,
        UserId = u.Id,
    
        Roles = String.Join("/", context.Roles.Where(r => r.Users.Any(u2 => u2.UserId == u.Id)).Select(r => r.Name.First()))
    
    }).ToList();