过滤用户列表asp.net标识

时间:2014-04-03 19:38:52

标签: c# asp.net-mvc asp.net-identity

我想根据他们的角色过滤注册用户列表。我设法做到这一点,以便它显示某个角色的用户,但我希望实现的完全相反,只显示该用户组中的用户

这是我的代码:

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 identity 2

2 个答案:

答案 0 :(得分:1)

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))

答案 1 :(得分:1)

我设法过滤掉具有辅助角色的超级管理员,真的很简单,只需获取超级管理员的用户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());