1

ASP.netを使用して、コード内のプロファイルの特定のフィールドにアクセスするための推奨される最良の方法があります。私は古いProblem-Design-Solution2.0の本を調べていましたが、DB内のすべてのメンバーをプルしてから、各メンバーのプロファイルを反復処理することでそれを実行します(以下のコードを参照)。もっと良い方法はありますか?

for each (MembershipUser user in Membership.GetAllUsers())
{
    ProfileCommon userProfile = profile.GetProfile(user.UserName);
    if (userProfile.mysetting == desiredValue)
    { 
         //do something
    }
}

編集1

メンバーをプルしてからプロファイルをプルするよりも少し効率的に実行できることがわかりました。すべてのメンバーがプロファイルを持っているわけではない可能性があるため、次のコードを使用すると、すべてのプロファイルをプルします(メンバーよりも数が少ない場合があり、それを繰り返し処理できます。

for each (ProfileInfo theProfile in ProfileManager.GetAllProfiles (ProfileAuthenticationOption.All)
{
    ProfileCommon pc = ProfileBase.Create(theProfile.UserName)
    if (pc.mysetting == desiredValue)
    {
        //do something
    }
}

それでも各プロファイルのDBをラウンドトリップしますが、メンバーを使用した場合ほど多くは実行されない可能性があります...

4

3 に答える 3

2

組み込みのプロファイルを使用すると、これ以上の方法はありません。Timが提供するオプションの1つは、テーブルプロファイルプロバイダーまたは独自のプロファイルプロバイダーの作成です。

または、完全に別のルート、つまりプロファイル情報を独自のカスタムテーブルに保存することもできます。

于 2011-03-25T01:02:56.840 に答える
0

おそらくlinqを使用した方がうまくいく可能性があります。現在、VSはありませんが、擬似コードは次のようになります。

var users = from MembershipUser user in Membership.GetAllUsers()
  where user.mysetting == desiredValue
  select user

次に、ユーザーを繰り返し処理します。

foreach(MembershipUser u in users) {
// do something
}

関心のあるものだけを含める必要があります。LinqはSQLの実行を正しく処理する必要がありますが、プロファイラーで何が行われているかを確認できます。


編集

実際、パフォーマンスの観点からはおそらく何も得られないでしょうが、GetAllUsersはすべてを取り戻す予定です。ユーザーテーブルのlinq2sqldbmlマップを作成し、カスタムプロパティに対するクエリにMembershipクラスの代わりにそれを使用することをお勧めします。


編集2

ASP.NETの役割とプロファイル:カスタムプロファイルプロパティに一致するユーザーのコレクションをクエリするための最良の方法は?

テーブルプロファイルプロバイダーを使用している場合は、そのテーブルに対してlinqクエリを使用できる場合があります: http ://weblogs.asp.net/kencox/archive/2010/09/05/using-the-sql-table- profile-provider-in-asp-net-4-web-applications-c-amp-vb.aspx

于 2011-03-24T22:01:40.413 に答える
0

テーブルプロファイルプロバイダーを使用してカスタムクエリを作成し、目的の設定を取得できます。

于 2011-03-24T22:13:22.143 に答える