我的大部分应用程序都使用经过编译的查询来检索数据。在这些查询中,我经常提到当前用户。我注意到如果用户 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 的引用。
我为 SQL Server 运行了 Profiler,并注意到当编译的查询被执行时,生成的 TSQL 两次都引用了用户 A 的 ID。
所以我的问题是:
编译后的查询会以某种方式缓存吗?
如果是这样,寿命是多少,我可以控制它吗?
在 ASP.net 应用程序的已编译查询设计中引用“当前用户”是否错误?
谢谢大家!