2011-01-02 3 views
7

Voglio fare un "GetUsersInRoles", cioè voglio trovare tutti gli utenti di Membership che hanno almeno uno dei ruoli in una serie di ruoli, ma io posso sembra che mi giri la testa.appartenenza a asp.net C#: come fare un GetUsersInRoles (più ruoli) H

Ho ottenuto GetUsersInRole, Membership.GetAllUsers(), Linq, ... ma come?

Qualsiasi feedback è molto apprezzato

Tommy

+0

Questo avrebbe richiesto circa 10 secondi per scrivere in un processo memorizzato. –

risposta

10

Ecco una versione Linq, restituisce un MembershipUserCollection proprio come i simili metodi Membership (FindUsersByEmail, FindUsersByName). Non è molto bello dato che si basa sul effetto collaterale PerOgni:

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; 
    } 

In alternativa, se un elenco di MembershipUser farà:

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; 
    } 

E infine se avete solo bisogno i nomi utente si può saltare una select :

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

Grazie mille per tutte le tue risposte e risposte rapide. Sfortunatamente non posso aggiungere "punti utili" perché mi mancano punti di reputazione. – tommyp

1

non c'è tale metodo come GetUsersInRoles ma si dovrà usare getUsersInRole e ciclo attraverso i ruoli richiesti.

po 'complicato, ma qui è un modo:

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

Giusto - questo è quello che sto cercando per un bel modo di fare, preferibilmente usando Linq – tommyp

1

Davvero ASP.Net provider di appartenenza sembra essere costruita con il pensiero di un utente di essere legato ad un singolo ruolo. tuttavia abbiamo avuto impostazioni simili su progetti su cui abbiamo lavorato. è un po 'imbarazzante, ma provare qualcosa di simile, che ha lavorato per noi:

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)); 
} 
Problemi correlati