Ли кеширование скомпилированных запросов? - PullRequest
3 голосов
/ 17 июня 2009

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

Так что мой вопрос таков:

Скомпилированные запросы как-то кэшируются?

Если да, то какова продолжительность жизни, и могу ли я контролировать ее?

Является ли ссылка на «текущего пользователя» в скомпилированном запросе плохим дизайном для приложения ASP.net?

Спасибо всем!

1 Ответ

2 голосов
/ 17 июня 2009

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