簡體   English   中英

編譯查詢緩存嗎?

[英]Do Compiled Queries Cache?

我的大部分應用程序都使用編譯查詢來檢索數據。 在這些查詢中,我經常會提到當前用戶。 我注意到如果用戶 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是一個 static 屬性,它會根據登錄者的不同而變化。

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

當我第一次使用用戶 A 登錄時,上面編譯的查詢返回用戶 A 的記錄。 因此 User.Current 也返回對用戶 A 的正確引用。但是,當我以用戶 B 身份登錄時,上面編譯的查詢仍然返回用戶 A 的記錄,盡管 User.Current 正在返回對用戶 B 的引用。

我為 SQL 服務器運行 Profiler,並注意到在執行編譯查詢時生成的 TSQL 兩次都引用了用戶 A 的 ID。

所以我的問題是:

編譯查詢是否以某種方式緩存?

如果是這樣,壽命有多長,我可以控制它嗎?

在 ASP.net 應用程序的編譯查詢中引用“當前用戶”是否是錯誤的設計?

謝謝大家!

您需要在已編譯的查詢中允許一個字符串參數。 否則它將在.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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM