Как лучше всего реализовать пользовательский поиск на провайдере членства - PullRequest
8 голосов
/ 07 января 2009

Из коробки System.Web.Security.Membership реализует несколько методов поиска:

  • FindUsersByEmail
  • FindUsersByName

Я использую проект WSAT от CodePlex для администрирования моей базы данных Членства. Инструмент реализует дополнительные свойства профиля в классе ProfileCommon.

Допустим, у меня есть свойство с именем Фирма в профиле пользователя.

Мне нужно реализовать собственный метод поиска для поиска по свойству Firm, и я хотел бы сделать все это в коде. Не хочу писать хранимую процедуру (поскольку все свойства профиля хранятся в 1 столбце базы данных в инструменте WSAT).

Что-то вроде этого, очевидно, не является правильным способом сделать это, но здесь это просто для демонстрации доступа к свойствам профиля пользователя:

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

Могу ли я превратить это в некое добро LINQ?

Ответы [ 4 ]

22 голосов
/ 23 апреля 2009

Ну, разве ты не можешь просто разыграть это?

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

Надеюсь, это поможет вам, ребята

3 голосов
/ 08 января 2009

Получил помощь от коллеги, который хорошо разбирается в linq. Проблема в том, что MembershipUserCollection не реализует IEnumerable (!).

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

в данном случае allUsers - это список, который мне нужно было заполнить элементами коллекции Membership.GetAllUsers ().

0 голосов
/ 27 октября 2012

Нет встроенной функции, предоставляемой Microsoft. Вот пример поиска членства пользователя с именем пользователя и адресом электронной почты
Пример:
Просто скопируйте ниже функцию и реализуйте ее - Готово ...

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();
        }
0 голосов
/ 22 октября 2009

Просто для записи я создал этот метод расширения, который, я думаю, работает:

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

Он также преобразует MembershipUserCollection в IEnumerable<MembershipUser>, поэтому все остальные методы LINQ будут работать позже.

...