编译查询缓存?

时间:2009-06-16 22:31:06

标签: asp.net linq linq.compiledquery

我的很多应用程序都使用编译查询来检索数据。在这些查询中,我经常会引用当前用户。我注意到如果用户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应用程序的编译查询错误设计中引用“当前用户”吗?

全部谢谢!

1 个答案:

答案 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);