筛选用户列表 asp.net 标识

本文关键字:net 标识 asp 列表 用户 筛选 | 更新日期: 2023-09-27 17:56:33

我想根据注册用户的角色过滤他们的列表。我已经设法做到了,以便它显示某个角色的用户,但我想要实现的是完全相反的,只显示不在该用户组中的用户

这是我的代码:

var users = UserManager.Users.ToListAsync();
var roleUsers = RoleManager.Roles.Single(a => a.Name.Equals("Super Admin")).Users;
var list = (from r in roleUsers
            join u in users on r.UserId equals u.Id
            select u);

更新

多亏了@sjkm我才能用这个过滤掉超级管理员

var users = UserManager.Users.ToList();
var roles = RoleManager.Roles.Where(a => a.Name != "Super Admin").ToList();
var userList = new List<IdentityUserRole>();
foreach (var role in roles)
{
    userList.AddRange(role.Users.ToList());
}
var list = (from r in userList
            join u in users on r.UserId equals u.Id
            select u).Distinct();
return View(list);

我现在的问题是用户既是超级管理员又是另一个角色,显示在此列表中,所以我现在需要进一步过滤此列表以删除可能处于其他角色的任何超级管理员

我也忘了提到这是使用 asp.net 身份 2

筛选用户列表 asp.net 标识

我已经设法过滤掉了具有次要角色的超级管理员,实际上相当简单,只需获取超级管理员的用户 ID 列表并将其从非超级管理员用户列表中删除即可查找并删除具有次要角色的用户

var users = UserManager.Users.ToList();
var roles = RoleManager.Roles.Where(a => a.Name != "Super Admin").ToList();
var superAdmins = RoleManager.Roles.Single(b => b.Name == "Super Admin").Users;
var userList = new List<IdentityUserRole>();
foreach (var role in roles)
{
    userList.AddRange(role.Users.ToList());
}
foreach (var superAdmin in superAdmins)
{
    userList.RemoveAll(x => x.UserId == superAdmin.UserId);
}
var list = (from r in userList
            join u in users on r.UserId equals u.Id
            orderby u.FirstName ascending
            orderby u.LastName ascending
            select u).Distinct();
return View(list);

毫无疑问,这是一种非常垃圾和低效的方式,但它仍然可以完成工作,但如果有人可以简化它,那么请成为我的客人

希望这对其他人有用!

更新

设法通过获取用户列表并删除用户 ID 与超级管理员用户列表中出现的用户 ID 匹配的用户来简化此操作

var users = UserManager.Users.ToList();
var superAdmins = RoleManager.Roles.Single(b => b.Name == "Super Admin").Users;
foreach (var superAdmin in superAdmins)
{
    users.RemoveAll(c => c.Id == superAdmin.UserId);
}
return View(users.ToList());
var roles = RoleManager.Roles.Where(r => r.Name != "Super Admin").ToList();
var users = new List<User>();
foreach(var role in roles) {
    users.AddRange(role.Users.ToList());
}
// 'users'-List contains all the users which do not have the 'Super Admin' role

(为了获得更好的性能,请获取角色的所有 ID,并使用单个查询Users.Where(u => rolesIds.Contains(u.Role_IDFS))选择用户)