gpt4 book ai didi

c# - 身份 2.2.1 中具有角色列表的用户列表

转载 作者:太空狗 更新时间:2023-10-29 23:44:25 25 4
gpt4 key购买 nike

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

期望的结果

User                   Roles
-----------------------------------------
John Admin
Jane Staff, HR, Payroll
MyCoolUserName User

我离 this post 很近了和 this post .这是我到目前为止得到的结果。

View 模型:

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

[Display(Name = "Roles")]
public string Roles { get; set; }
}

Controller :

试验#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);
}
}

试验 #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);
}
}

这是我在更改 RoleId 时获得的试用 #2 的结果至 RoleName : GIF showing objects in User.Roles

我可以在试验 #2 中看出,u.Roles链接到 UserRoles table 。从逻辑上讲,我知道我想要的是内部加入 Roles表并在那里获取名称。

我希望有人能帮助我吗?提前致谢。 Sample Project

最佳答案

感谢@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);
}
}

版本 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);
}
}

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

关于c# - 身份 2.2.1 中具有角色列表的用户列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34051663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com