멤버십 제공 업체에서 사용자 정의 검색을 가장 잘 구현하는 방법

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

  •  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();
        }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top