3

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

谢谢大家!

4

1 回答 1

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);
于 2009-06-17T02:10:32.500 回答