メンバーシッププロバイダーでカスタム検索を最適に実装する方法

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

  •  03-07-2019
  •  | 
  •  

質問

デフォルトでは、System.Web.Security.Membershipはいくつかの検索メソッドを実装しています:

  • FindUsersByEmail
  • FindUsersByName

CodePlexのWSATプロジェクトを使用して、メンバーシップデータベースを管理しています。このツールは、ProfileCommonクラスに追加のプロファイルプロパティを実装します。

ユーザーのプロファイルに Firm というプロパティがあるとします。

Firmプロパティを検索するには、カスタム検索メソッドを実装する必要があります。これをすべてコードで実行したいと思います。ストアドプロシージャを書きたくない(すべてのプロファイルプロパティが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 <!> ltを実装していないことです。 T <!> gt; (!)。

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

また、MembershipUserCollectionIEnumerable<MembershipUser>に変換するため、他のすべてのLINQメソッドは後で機能します。

Microsoftが提供する組み込み関数はありません。 UserNameとメールアドレスを使用した検索メンバーシップユーザーの例を次に示します
例:
以下の機能をコピーして機能を実装-完了...

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