8

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 の利点に変えることはできますか?

4

4 に答える 4

22

じゃあキャストできないの?

IEnumerable<MembershipUser> searchResults = Membership.GetAllUsers().Cast<MembershipUser>();

これが皆さんのお役に立てば幸いです

于 2009-04-23T09:36:06.283 に答える
3

linq が得意な同僚に助けてもらいました。ここでの課題は、MembershipUserCollection が IEnumerable< T > (!) を実装していないことです。

        List<MembershipUser> searchResults = allUsers.Where(user => 
        Profile.GetProfile(user.UserName).Firm.ToLowerInvariant()
        .Contains(firmName.ToLowerInvariant())).ToList();

この場合、allUsers は List であり、Membership.GetAllUsers() コレクション内の項目を入力する必要がありました。

于 2009-01-07T22:24:16.543 に答える
0

記録のために、この拡張メソッドを作成しましたが、これはちょっとうまくいくと思います:

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 メソッドは後で機能します。

于 2009-10-22T17:04:49.103 に答える
0

マイクロソフトが提供する組み込み関数はありません。UserName と Email Address を使用した検索メンバーシップ ユーザーの例を次に示します

以下の関数をコピーして実装するだけです。完了...

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();
        }
于 2012-10-27T13:00:22.370 に答える