Come implementare al meglio la ricerca personalizzata su un provider di appartenenze
-
03-07-2019 - |
Domanda
Immediatamente, System.Web.Security.Membership implementa un paio di metodi di ricerca:
- FindUsersByEmail
- FindUsersByName
Sto usando il progetto WSAT di CodePlex per amministrare il mio database di appartenenza. Lo strumento implementa ulteriori proprietà del profilo in una classe ProfileCommon.
Supponiamo che io abbia una proprietà chiamata Azienda nel profilo dell'utente.
Devo implementare un metodo di ricerca personalizzato per cercare nella proprietà Firm e vorrei fare tutto questo nel codice. Non voglio scrivere una procedura memorizzata (poiché tutte le proprietà del profilo sono memorizzate in 1 colonna del database nello strumento WSAT).
Qualcosa del genere ovviamente non è il modo giusto per farlo, ma qui è solo per dimostrare l'accesso alle proprietà del profilo dell'utente:
private MembershipUserCollection SearchByFirm(string firmName, MembershipUserCollection allRegisteredUsers)
{
MembershipUserCollection searchResults = new MembershipUserCollection();
foreach (MembershipUser user in allRegisteredUsers)
{
ProfileCommon profile = Profile.GetProfile(user.UserName);
if (profile.Firm.ToLowerInvariant().Contains(firmName.ToLowerInvariant()))
{
searchResults.Add(user);
}
}
return searchResults;
}
Posso trasformarlo in qualche bontà di LINQ?
Soluzione 2
Ho ottenuto l'aiuto di un collega che è bravo con Linq. La sfida qui è che MembershipUserCollection non implementa IEnumerable & Lt; T & Gt; (!).
List<MembershipUser> searchResults = allUsers.Where(user =>
Profile.GetProfile(user.UserName).Firm.ToLowerInvariant()
.Contains(firmName.ToLowerInvariant())).ToList();
in questo caso allUsers è un elenco che ho dovuto compilare con gli elementi nella raccolta Membership.GetAllUsers ().
Altri suggerimenti
Beh, non puoi semplicemente lanciarlo?
IEnumerable<MembershipUser> searchResults = Membership.GetAllUsers().Cast<MembershipUser>();
Spero che questo ti aiuti ragazzi
Solo per la cronaca ho creato questo metodo di estensione che penso funzioni in qualche modo:
namespace WebDibaelsaMVC.Utils.MembershipUserCollectionExtensions
{
public static class MembershipUserCollectionExtensions
{
public static IEnumerable<MembershipUser> Where(this MembershipUserCollection userCollection,Func<MembershipUser,bool> func)
{
foreach (MembershipUser membershipUser in userCollection)
{
if (func(membershipUser))
yield return membershipUser;
}
}
}
}
Converte anche MembershipUserCollection
in IEnumerable<MembershipUser>
in modo che tutti gli altri metodi LINQ funzionino in seguito.
Non esiste alcuna funzione integrata fornita da Microsoft. Ecco l'esempio di utente di appartenenza alla ricerca con Nome utente e Indirizzo e-mail
Esempio:
Basta copiare la funzione di seguito e implementarla - Fine ...
Public List<MembershipUser> SearchMembershipUser(string strUserName, String strEmail)
{
IEnumerable<MembershipUser> MUser;
if ((!string.IsNullOrEmpty(strUserName) || !string.IsNullOrEmpty(strEmail)))
{
if (!string.IsNullOrEmpty(strUserName) && !string.IsNullOrEmpty(strEmail))
{
MUser = Membership.GetAllUsers().Cast<MembershipUser>()
.Where(x => x.UserName != CurrentUser && x.UserName == strUserName && x.Email == strEmail);
}
else if (!string.IsNullOrEmpty(strUserName))
{
MUser = Membership.GetAllUsers().Cast<MembershipUser>()
.Where(x => x.UserName != CurrentUser && x.UserName == strUserName);
}
else
{
MUser = Membership.GetAllUsers().Cast<MembershipUser>()
.Where(x => x.UserName != CurrentUser && x.Email == strEmail);
}
}
else
{
MUser = Membership.GetAllUsers().Cast<MembershipUser>().Where(x => x.UserName != CurrentUser);
}
return MUser.OrderBy(x => x.UserName).ToList();
}