LinqToSql 查询执行计时

本文关键字:执行 查询 LinqToSql | 更新日期: 2023-09-27 17:55:46

我想问一下LinqToSql查询的执行时间。

据我了解,请参阅此 MSDN 博客。似乎 LinqToSql 查询只会在以下情况下执行

  1. IQueryable的财产被访问
  2. 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。为什么我仍然获得旧值?

LinqToSql 查询执行计时

一旦你在这个行上得到 Value1,就会调用数据库

string s1 = ents.first().Value1;

然后,它将对象保留在内存中(以及 Value2)。 当您尝试访问 Value2 时,它不会再次调用数据库。

最后,我想我找到了背后的工作原理。L2S真的像

LinqToSql 查询只会在以下情况下连接到数据库并执行

  1. IQueryable的财产正在访问
  2. IQueryable 的函数(不返回 IQueryable/IEnumeration 类型)被调用

但除此之外,在 L2S 之后,第一次从数据库中获取每条记录的数据。它将按其 PK 缓存记录。

最终,在每次进一步获取时。它将检查之前是否提取过该记录。

  1. 是的,它将使用记录的缓存版本而不是数据库版本。
  2. 如果没有,它将使用数据库版本。

附言缓存记录的生存期将持续到 DBContext 被释放。