私のアプリケーションの多くは、コンパイルされたクエリを使用してデータを取得します。これらのクエリでは、現在のユーザーを参照することがよくあります。ユーザー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アプリケーションの悪い設計ですか?
皆さんありがとう!