Come implementare al meglio la ricerca personalizzata su un provider di appartenenze

StackOverflow https://stackoverflow.com/questions/419127

  •  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?

È stato utile?

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();
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top