Wie man am besten benutzerdefinierte Suche auf einer Membership Provider implementieren

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

  •  03-07-2019
  •  | 
  •  

Frage

Aus dem Kasten heraus, System.Web.Security.Membership implementiert ein paar Suchmethoden:

  • FindUsersByEmail
  • FindUsersByName

Ich verwende die WSAT Projekt von CodePlex rel="nofollow meine Mitgliedschaft Datenbank zu verwalten. Das Tool implementiert zusätzliche Profileigenschaften in einer Klasse Profile.

Lassen Sie uns sagen, ich habe eine Eigenschaft namens Firma in das Profil des Benutzers.

Ich brauche eine benutzerdefinierte Suchmethode zu implementieren, auf der Firma Immobilien suchen, und ich möchte dies in Code tun. Sie wollen nicht eine gespeicherte Prozedur schreiben (da alle Profileigenschaften in 1 Datenbankspalte in dem WSAT Werkzeug gespeichert werden).

So etwas ist natürlich nicht der richtige Weg, es zu tun, aber hier ist es nur demonstriert die Profileigenschaften des Benutzers zuzugreifen:

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

Kann ich das in eine LINQ Güte machen?

War es hilfreich?

Lösung 2

etwas Hilfe von einem Kollegen erhielt, die mit Linq gut ist. Die Herausforderung dabei ist, dass MembershipUserCollection nicht IEnumerable implementieren (!).

        List<MembershipUser> searchResults = allUsers.Where(user => 
        Profile.GetProfile(user.UserName).Firm.ToLowerInvariant()
        .Contains(firmName.ToLowerInvariant())).ToList();

in diesem Fall allusers ist eine Liste, die ich mit den Einzelteilen in dem Membership.GetAllUsers () Sammlung füllen musste.

Andere Tipps

Nun können Sie nicht nur sie werfen?

IEnumerable<MembershipUser> searchResults = Membership.GetAllUsers().Cast<MembershipUser>();

Hope, das hilft euch

Nur für das Protokoll ich diese Erweiterung Methode geschaffen, die ich denke, dass es irgendwie funktioniert:

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

Es wandelt auch die MembershipUserCollection zu einem IEnumerable<MembershipUser> so alle anderen LINQ Methoden danach arbeiten.

Es gibt keine in-Funktion von Microsoft gebaut. Hier ist das Beispiel der Suche Mitgliedschaft Benutzer mit Benutzername und E-Mail-Adresse
Beispiel:
Just unten Funktion Kopieren und implementieren - fertig ...

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();
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top