我想问一下LinqToSql查询的执行时间。
据我了解,请参阅此 MSDN 博客。似乎 LinqToSql 查询只会在以下情况下执行
-
IQueryable
的财产被访问 -
IQueryable
的函数(不返回IQueryable
/IEnumeration
类型)被调用
但是,我做了这样的实验:
var ents = from ent in dal.ents
select ent;
string s1 = ents.first().Value1; // I got 1 here
Console.ReadLine(); // When the system is waiting for my input. I change the same record manually in DB, I change Value2 of ent from 2 to 3 here.
string s2 = ents.first().Value2 // I got 2 here.
为什么我仍然得到"2"s2
?
据我了解,ents.first().Value2
应该再次连接到数据库并获得新Value2
。为什么我仍然获得旧值?
一旦你在这个行上得到 Value1,就会调用数据库
string s1 = ents.first().Value1;
然后,它将对象保留在内存中(以及 Value2)。 当您尝试访问 Value2 时,它不会再次调用数据库。
最后,我想我找到了背后的工作原理。L2S真的像
LinqToSql 查询只会在以下情况下连接到数据库并执行
- IQueryable的财产正在访问
- IQueryable 的函数(不返回 IQueryable/IEnumeration 类型)被调用
但除此之外,在 L2S 之后,第一次从数据库中获取每条记录的数据。它将按其 PK 缓存记录。
最终,在每次进一步获取时。它将检查之前是否提取过该记录。
- 是的,它将使用记录的缓存版本而不是数据库版本。
- 如果没有,它将使用数据库版本。
附言缓存记录的生存期将持续到 DBContext 被释放。