Как лучше всего реализовать пользовательский поиск у поставщика членства

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

  •  03-07-2019
  •  | 
  •  

Вопрос

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

  • Найти пользователей по электронной почте
  • Найти пользователей по имени

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

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

Мне нужно реализовать собственный метод поиска для поиска по свойству Firm, и я хотел бы сделать все это в коде.Не хочу писать хранимую процедуру (поскольку все свойства профиля хранятся в одном столбце базы данных в инструменте 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?

Это было полезно?

Решение 2

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

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

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

Другие советы

Ну, ты не можешь просто бросить это?

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

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

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

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 впоследствии работают.

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();
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top