我的很多应用程序都使用编译查询来检索数据。在这些查询中,我经常会引用当前用户。我注意到如果用户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应用程序的编译查询错误设计中引用“当前用户”吗?
全部谢谢!
答案 0 :(得分:2)
您需要在编译的查询中允许字符串参数。否则它将在.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);