Ли кеширование скомпилированных запросов?
Большая часть моего приложения использует собранные запросы для получения данных. В этих запросах я буду часто ссылаться на текущего пользователя. Я заметил, что если пользователь 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, вышеуказанный скомпилированный запрос по-прежнему возвращает записи пользователя A, несмотря на тот факт, что User.Current возвращает ссылку на пользователя B.
Я запустил Profiler для SQL Server и заметил, что когда скомпилированный запрос был выполнен, оба раза сгенерированный TSQL ссылался на идентификатор пользователя А.
Итак, мой вопрос заключается в следующем:
Скомпилированные запросы как-то кешируются?
Если да, то какова продолжительность жизни, и могу ли я это контролировать?
Является ли ссылка на "текущего пользователя" в скомпилированном запросе плохим дизайном для приложения ASP.net?
Спасибо всем!
1 ответ
Вам нужно разрешить строковый параметр в скомпилированном запросе. В противном случае он разрешит значение строки во время.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);