具有Identity 2.2.1中的角色列表的用户列表

RoL*_*LLs 5 c# linq lambda asp.net-identity asp.net-identity-2

所以我一直在搜索Google和SO.这个问题的感觉已被多次询问,但没有答案对我有帮助,但我觉得我已经接近了.但是,我是LINQ和Lambda的新手,并且没有做我想做的事情的知识.

期望的结果

User                   Roles
-----------------------------------------
John                   Admin
Jane                   Staff, HR, Payroll
MyCoolUserName         User
Run Code Online (Sandbox Code Playgroud)

我非常接近这篇文章这篇文章.这是我到目前为止所得到的.

视图模型:

public class UsersViewModel {
    [Display(Name = "User")]
    public ApplicationUser User { get; set; }

    [Display(Name = "Roles")]
    public string Roles { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

试验#1

此解决方案返回角色的空白,我不得不将其添加到我的web.config文件中:<roleManager enabled="true" />

public class UsersController : Controller {
    public async Task Index() {
        var allUsers = await db.Users.ToListAsync();
        var users = new List();
        foreach (var user in allUsers) {
            String[] roles = Roles.GetRolesForUser(user.UserName);
            users.Add(new UsersViewModel {User = u, Roles = String.Join(",", roles.ToArray())});
        }
        return View(users);
    }
}
Run Code Online (Sandbox Code Playgroud)

试验#2

此解决方案为每个角色的每个用户返回一行,但仅返回 RoleId

public class UsersController : Controller {
    public async Task Index() {
        var allUsers = await db.Users.ToListAsync();
        var users = allUsers.Select(u => new UsersViewModel {User = u, Roles = String.Join(",", u.Roles.Select(r => r.RoleId))}).ToList();
        return View(users);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我改为试用#2时RoleId获得的结果RoleName: GIF在User.Roles中显示对象

我可以说,在试验#2中,u.Roles它与UserRoles表格相关联.从逻辑上讲,我知道我想要的是内部加入Roles表并在那里得到名称.

我希望有人可以帮助我吗?提前致谢.示例项目

RoL*_*LLs 1

感谢@Kienct89 和我们的讨论,我自己无意中偶然发现了答案。这就是我得到的,如果有人可以或想要改进它,请这样做。

例如:我不知道是否最好先将所有角色放入一个变量中并对其进行迭代,您在版本 1 中看到这一点,或者不像在版本 2 中看到的那样。

版本1

public class UsersController : Controller {
    public async Task Index() {
        var allUsers = await db.Users.ToListAsync();
        var users = allUsers.Select(u => new UsersViewModel {User = u, Roles = String.Join(",", db.Roles.Where(role => role.Users.Any(user => user.UserId == u.Id)).Select(r => r.Name))}).ToList();
        return View(users);
    }
}
Run Code Online (Sandbox Code Playgroud)

版本 2(首选?)

public class UsersController : Controller {
    public async Task Index() {
        var allUsers = await db.Users.ToListAsync();

        // set all roles to a variable, so that we don't hit the database for every user iteration
        // is this true?
        var allRoles = await db.Roles.ToListAsync();

        var users = allUsers.Select(u => new UsersViewModel {User = u, Roles = String.Join(",", allRoles.Where(role => role.Users.Any(user => user.UserId == u.Id)).Select(r => r.Name))}).ToList();
        return View(users);
    }
}
Run Code Online (Sandbox Code Playgroud)

我觉得版本 2更高效,因为它不会访问数据库来获取每个用户的角色。相反,它具有变量中的角色。我不确定我是否正确,但我希望得到启发并向任何知道的人学习。