メンバーシッププロバイダーでカスタム検索を最適に実装する方法
-
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;
}
}
}
}
また、MembershipUserCollection
をIEnumerable<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();
}