3

私のアプリケーションの多くは、コンパイルされたクエリを使用してデータを取得します。これらのクエリでは、現在のユーザーを参照することがよくあります。ユーザーBが別のユーザーAの後にログインすると、ユーザーBにはユーザーAの情報が表示されることに注意してください。

私はアプリケーション全体でこのようなクエリを持っています

public static Func<DataContext, MyRecord> CurrentUserRecords =
            CompiledQuery.Compile<DataContext, MyRecord>(
                (DataContext db) =>
                    (from r in db.MyRecords
                     where
                        r.User == User.Current 
                     select r).SingleOrDefault());

User.Currentは、ログインしているユーザーに応じて変化する静的プロパティです。

public static User Current 
{
    get { return MyBase<User>.Get((int)(HttpContext.Current.Session["CurrentUserID"] ?? 0)); }
}

ユーザーAで初めてログインすると、上記のコンパイル済みクエリはユーザーAのレコードを返します。したがって、User.CurrentもユーザーAへの適切な参照を返します。ただし、ユーザーBとしてログインすると、User.CurrentがユーザーBへの参照を返しているにもかかわらず、上記のコンパイル済みクエリはユーザーAのレコードを返します。

Profiler for SQL Serverを実行しましたが、コンパイルされたクエリが実行されると、生成されたTSQLがユーザーAのIDを両方とも参照していることに気付きました。

だから私の質問はこれです:

コンパイルされたクエリはどういうわけかキャッシュしますか?

もしそうなら、寿命は何ですか、そして私はそれを制御できますか?

コンパイルされたクエリで「現在のユーザー」を参照することは、ASP.netアプリケーションの悪い設計ですか?

皆さんありがとう!

4

1 に答える 1

2

コンパイルされたクエリで文字列パラメーターを許可する必要があります。それ以外の場合は、.Compile() 中に文字列の値を解決します。これを試して:

public static Func<DataContext, string, MyRecord> UserRecordByParam =
  CompiledQuery.Compile<DataContext, string, MyRecord>
(
  (DataContext db, string UserName) =>
   db.MyRecords.Where( r => r.User == UserName ).SingleOrDefault()
);

public static Func<DataContext, MyRecord> CurrentUserRecord =
  (DataContext db) => UserRecordByParam(db, User.Current);
于 2009-06-17T02:10:32.500 に答える