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)
此解决方案返回角色的空白,我不得不将其添加到我的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)
此解决方案为每个角色的每个用户返回一行,但仅返回 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:

我可以说,在试验#2中,u.Roles它与UserRoles表格相关联.从逻辑上讲,我知道我想要的是内部加入Roles表并在那里得到名称.
我希望有人可以帮助我吗?提前致谢.示例项目
感谢@Kienct89 和我们的讨论,我自己无意中偶然发现了答案。这就是我得到的,如果有人可以或想要改进它,请这样做。
例如:我不知道是否最好先将所有角色放入一个变量中并对其进行迭代,您在版本 1 中看到这一点,或者不像在版本 2 中看到的那样。
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)
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更高效,因为它不会访问数据库来获取每个用户的角色。相反,它具有变量中的角色。我不确定我是否正确,但我希望得到启发并向任何知道的人学习。
| 归档时间: |
|
| 查看次数: |
1843 次 |
| 最近记录: |