Как лучше всего реализовать пользовательский поиск у поставщика членства
-
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();
}