멤버십 제공 업체에서 사용자 정의 검색을 가장 잘 구현하는 방법
-
03-07-2019 - |
문제
상자 밖에서 System.Web.Security.Membership은 몇 가지 검색 방법을 구현합니다.
- findusersbyemail
- findusersbyname
나는 사용하고있다 CodePlex의 WSAT 프로젝트 내 멤버십 데이터베이스를 관리합니다. 이 도구는 ProfileCommon 클래스에서 추가 프로파일 속성을 구현합니다.
내가 부르는 재산이 있다고 가정 해 봅시다 단단한 사용자의 프로필에서.
회사 속성에서 검색하려면 사용자 정의 검색 방법을 구현해야하며 코드 에서이 모든 작업을 수행하고 싶습니다. 저장된 프로 시저를 작성하고 싶지 않습니다 (모든 프로파일 속성은 WSAT 도구의 1 개의 데이터베이스 열에 저장되므로).
이와 같은 것은 분명히 그것을하는 올바른 방법은 아니지만 여기서는 사용자의 프로필 속성에 액세스하는 것을 보여주는 것입니다.
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는 멤버십의 항목으로 채워야하는 목록입니다.
다른 팁
그냥 캐스팅 할 수 없니?
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
an 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();
}