Comment implémenter au mieux la recherche personnalisée sur un fournisseur d'adhésion

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

  •  03-07-2019
  •  | 
  •  

Question

System.Web.Security.Membership implémente plusieurs méthodes de recherche:

  • FindUsersByEmail
  • FindUsersByName

J'utilise le projet WSAT de CodePlex pour administrer ma base de données d'adhésion. L'outil implémente des propriétés de profil supplémentaires dans une classe ProfileCommon.

Supposons que le profil de l'utilisateur comporte une propriété appelée Entreprise .

Je dois implémenter une méthode de recherche personnalisée pour effectuer une recherche sur la propriété de l'entreprise, et j'aimerais le faire en code. Vous ne voulez pas écrire de procédure stockée (toutes les propriétés de profil étant stockées dans une colonne de base de données dans l'outil WSAT).

Quelque chose comme cela n'est évidemment pas la bonne façon de le faire, mais il s'agit simplement de démontrer l'accès aux propriétés du profil de l'utilisateur:

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

Puis-je transformer cela en une sorte de bonté LINQ?

Était-ce utile?

La solution 2

Vous avez de l'aide d'un collègue qui est bon avec linq. Le problème ici est que MembershipUserCollection n’implémente pas IEnumerable & Lt; T & Gt; (!)

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

dans ce cas, allUsers est une liste que je devais remplir avec les éléments de la collection Membership.GetAllUsers ().

Autres conseils

Eh bien, ne pouvez-vous pas simplement le lancer?

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

J'espère que cela vous aide les gars

Juste pour l'enregistrement, j'ai créé cette méthode d'extension qui, je pense, fonctionne un peu:

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

Il convertit également le MembershipUserCollection en IEnumerable<MembershipUser> afin que toutes les autres méthodes LINQ fonctionnent par la suite.

Il n’existe pas de fonction intégrée fournie par Microsoft. Voici l'exemple d'un utilisateur membre de la recherche avec un nom d'utilisateur et une adresse électronique.
Exemple:
Copiez simplement la fonction ci-dessous et mettez-la en œuvre - Fait ...

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();
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top