gpt4 book ai didi

asp.net - 编译查询会缓存吗?

转载 作者:行者123 更新时间:2023-12-02 13:29:35 25 4
gpt4 key购买 nike

我的大部分应用程序都使用编译查询来检索数据。在这些查询中,我经常会提及当前用户。我注意到,如果用户 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 应用程序来说是不好的设计吗?

谢谢大家!

最佳答案

您需要在编译的查询中允许使用字符串参数。否则它将在 .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);

关于asp.net - 编译查询会缓存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1004263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com