如何获取列表中每个用户的角色名称?

时间:2017-04-27 20:17:52

标签: c# sql-server linq

我正在尝试填充一个RoleList,它将包含每个用户的角色名称。我在查询部分遇到问题。

我有2个表, IdentityUserRole 表,其中包含 UserId RoleId ,然后是 IdentityRoles RoleId 和角色的名称

这是我到目前为止所做的,它给了我多个问题。

public static IEnumerable<string> GetRolesByUserId(string userId)
{
    ApplicationDbContext db = new ApplicationDbContext();

    return db.Set<IdentityUserRole>().Where(r => r.UserId.Contains(userId)).Select(x => x.RoleId);
}

我最终会在此列表中调用GetRolesByUserId

private async Task<IEnumerable<UserViewModel>> GetUserData(ApplicationDbContext db)
{
  var users = db.Users;
  var list = await GetUsers(db, users);

var vmlist = list.Select(item => new UserViewModel()
{
    ID = item.ID,
    Username = item.Username,
    FirstName = item.FirstName,
    LastName = item.LastName,
    Email = item.Email,
    TaxID = item.TaxID,
    TaxIdHash = item.TaxIdHash,
    IV = item.IV,
    TaxIDEncrypted = item.TaxIDEncrypted,
    Active = item.Active,
    RoleList = GetRolesByUserId(item.ID),
    Roles = "",//string.Join(",", GetRolesByUserId(item.ID)).ToArray(),
    IsActive = item.IsActive,
    Status = item.Status
});

UserViewModel将RoleList作为

public List<string> RoleList { get; set; }

我对c#查询相当新,过去3天一直试图解决这个问题。如果有人可以帮我解决这个问题,请。谢谢。

1 个答案:

答案 0 :(得分:1)

关于查询部分,您需要以下内容:

public static List<string> GetRolesByUserId(string userId)
{
    var db = new ApplicationDbContext();

    var userRoles = from identityUserRole in db.Set<IdentityUserRole>
                    join identityRole in db.Set<IdentityRoles>
                    on identityUserRole.RoleId equals identityRole.RoleId
                    where identityUserRole.UserId == userId
                    select identityRole.Name;

    return userRoles.ToList();
}

以上是另一种声明LINQ查询的语法,它被称为查询语法,而您使用的语法称为流畅语法。最后,编译器会将用查询语法编写的查询转换为用 fluent语法编写的等效查询。我在这里使用查询语法的原因是我认为在这种特殊情况下,查询比用流利语法编写的查询更具可读性。

对于记录,流利语法中的等效查询如下:

var userRoles = db.Set<IdentityUserRole>
                  .Join(db.Set<IdentityRoles>,
                        identityUserRole => identityUserRole.RoleId,
                        identityRole => identityRole.RoleId
                        (identityUserRole, identityRole) => { identityRole. Name })
                  .Where(x=>x.UserId == userId)
                  .ToList();

关于RolesRolesList,我现在有以下评论。

由于Roles可以直接从RoleList计算,我建议您创建一个只有getter的属性,如下所示:

public string Roles 
{
    get 
    { 
        if(RoleList == null || RoleList.Count == 0)
        {
            return null;
        }
        return string.Join(",", RoleList);
    }
}