Ли кеширование скомпилированных запросов?

Большая часть моего приложения использует собранные запросы для получения данных. В этих запросах я буду часто ссылаться на текущего пользователя. Я заметил, что если пользователь 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);
Другие вопросы по тегам