2009-06-16 6 views
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に適切な参照を返すことになります。ただし、User.CurrentがUser Bへの参照を返しているにもかかわらず、ユーザーBとしてログインすると、上記のコンパイルされたクエリはユーザーAのレコードを返します。

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

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

は、クエリが何らかの形でキャッシュコンパイルのですか?

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

ASP.netアプリケーションのコンパイルされたクエリの不適切なデザインで「現在のユーザー」を参照していますか?

ありがとうございます!

答えて

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); 
+0

私はそれを恐れていました。私は現在、CompliledQuery.compileのオーバーロードが使用できるパラメータの量を最大限に活用しています。私はこれを見つけましたhttp://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/f1fc5570-be6d-4d7f-b94f-aa5b6e9922cf/ –

+1

あなたはFuncを使用する必要があります。 Funcの利用可能なパラメータのすべては、すべてのパラメータを表すオブジェクトを作成し、それを入力としてFuncに渡します。 – BZink

関連する問題