Membership.FindUsersByName, ecco perchè non mi funzionava.

Se nella vostre applicazioni fate uso delle membership di ASP.NET, vi sarà capitato (o vi potrà capitare) di cercare un utente dato una parte dello username.

La soluzione ovvia è quella di usare la funzione Membership.FindUsersByName, che come dice la descrizione

"Gets a collection of membership users where the user name contains the specified user name to match."

Bene, proprio quello che cercavamo, ma qui c'è da prestare un pò di attenzione. Infatti se come stringa mettiamo "pip" e stavamo cercando l'utente "pippo", non ci verrà ritornato proprio niente.
La cosa un pò mi puzzava e non capivo il perchè non mi ritornasse una lista di utenti che contenevano la stringa "pip" nello username, e dopo un pò di tentativi mi sono rassegnato ed ho abbandonato il tutto.

Ieri con Andrea ci siamo messi a vedere un pò meglio la facenda, ed analizzando con Reflector le classi delle SqlMembershipProvider ci siamo accorti che la stringa di ricerca viene passata direttamente a SQL, e quindi  ponendo due bei percento agli estremi della nostra stringa "%pip%" ecco che il tutto inizia a funzionare.

SqlCommand command1 = new SqlCommand("dbo.aspnet_Membership_FindUsersByName", holder1.Connection);
MembershipUserCollection collection1 = 
new MembershipUserCollection();
SqlDataReader reader1 = 
null;
command1.CommandTimeout = 
this.CommandTimeout;
command1.CommandType = CommandType.StoredProcedure;
command1.Parameters.Add(
this.CreateInputParam("@ApplicationName", SqlDbType.NVarChar, this.ApplicationName));
command1.Parameters.Add(
this.CreateInputParam("@UserNameToMatch", SqlDbType.NVarChar, usernameToMatch));
command1.Parameters.Add(
this.CreateInputParam("@PageIndex", SqlDbType.Int, pageIndex));
command1.Parameters.Add(
this.CreateInputParam("@PageSize", SqlDbType.Int, pageSize));
command1.Parameters.Add(parameter1);
Print | posted on martedì 12 settembre 2006 18:21