2011-01-02 18 views
7

Quiero hacer un "GetUsersInRoles", es decir, quiero encontrar todos MembershipUser tener al menos uno de los roles en un conjunto de roles, pero puedo Parece que entiendo por esto.asp.net C# membresía: cómo hacer un GetUsersInRoles (múltiples roles) H

Tengo GetUsersInRole, Membership.GetAllUsers(), Linq, ... pero ¿cómo?

Cualquier comentario se aprecia grandemente

Tommy

+0

Esto habría tomado aproximadamente 10 segundos para escribir en un proceso almacenado. –

Respuesta

10

Aquí hay una versión de LINQ, devuelve un MembershipUserCollection al igual que los métodos de miembros similares (FindUsersByEmail, FindUsersByName). No es muy bonito, ya que se basa en el efecto secundario ParaCada:

public static MembershipUserCollection FindUsersByRole(string[] roles) 
    { 
     MembershipUserCollection msc = new MembershipUserCollection(); 

     roles.Select(role => Roles.GetUsersInRole(role)) 
     .Aggregate((a, b) => a.Union(b).ToArray()) 
     .Distinct() 
     .Select(user => Membership.GetUser(user)) 
     .ToList().ForEach(user => msc.Add(user)); 

     return msc; 
    } 

Alternativamente, si una lista de MembershipUser hará:

public static List<MembershipUser> FindUsersByRole(string[] roles) 
    { 
     var userList = roles.Select(role => Roles.GetUsersInRole(role)) 
          .Aggregate((a, b) => a.Union(b).ToArray()) 
          .Distinct() 
          .Select(user => Membership.GetUser(user)) 
          .ToList(); 
     return userList; 
    } 

Y, finalmente, si sólo tiene los nombres de usuario puede omitir uno seleccione :

public static List<string> FindUsersByRole(string[] roles) 
    { 
     var userList = roles.Select(role => Roles.GetUsersInRole(role)) 
          .Aggregate((a, b) => a.Union(b).ToArray()) 
          .Distinct() 
          .ToList(); 
     return userList; 
    } 
+0

Muchas gracias por todas sus respuestas y respuestas rápidas. Lamentablemente, no puedo agregar puntos de "utilidad" ya que carezco de puntos de reputación. – tommyp

1

no hay método como GetUsersInRoles pero usted tendrá que usar getUsersInRole y bucle a través de sus roles necesarios.

poco complicado pero aquí es una manera:

string[] roles = {"role1", "role2" }; 
     string[] tempusers = new string[]{}; 
     List<string> users = new List<string>(); 
     foreach (string role in roles) 
     { 
      string[] usersInRole = Roles.GetUsersInRole(role); 
      users = tempusers.Union(usersInRole).ToList(); 
      tempusers = users.ToArray(); 
     } 
     foreach (string user in users) { Response.Write(user + "<br/>"); } 
+0

Derecha - eso es lo que estoy buscando una buena manera de hacer, preferiblemente utilizando Linq – tommyp

1

proveedor de pertenencia Realmente ASP.Net parece estar construido con la idea de un usuario que es atado a una sola función. sin embargo, hemos tenido configuraciones similares en proyectos en los que hemos trabajado. es un poco incómodo, pero intentar algo como esto lo que ha funcionado bien:

List<string> roleset_to_find = new List<string>() {"RoleA","RoleB"}; 

List<string> membersFound = new List<string>(); 

foreach (string role in roleset_to_find) 
{ 
     membersFound.AddRange(Roles.GetUsersInRole(role)); 
} 
Cuestiones relacionadas