2016-07-08 130 views
0

我想問一下關於LinqToSql查詢的執行時間。
從我的理解,請參閱本MSDN blog,看來,當被訪問1 IQueryable的財產
2的IQueryable的功能(這是沒有返回的IQueryable/IEnumeration類型)被稱爲LinqToSql查詢執行時間

然而LinqToSql查詢將只執行,我做實驗這樣的:

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。爲什麼我仍然獲得舊價值?

感謝所有對我的問題感興趣的人。

+0

您是否使用相同的數據上下文?另見[here](https://blogs.msdn.microsoft.com/dinesh.kulkarni/2008/07/02/linq-to-sql-tips-9-understanding-datacontexts-internal-caching/) –

+0

無法編譯代碼。請寫一個[Short Self Contained Correct Example](http://sscce.org/)。 – Aron

回答

0

最後,我想我找到了背後的工作原理。 L2S真的是那樣工作

LinqToSql查詢只會到DB連接,並執行

  1. IQueryable的財產被訪問
  2. 的IQueryable的功能是(這是沒有返回的IQueryable/IEnumeration型)稱爲

但在添加在L2S在第一次從每個記錄獲取來自DB的數據之後。它會通過它的PK緩存記錄。

最終,在每次進一步提取。它會檢查記錄是否已被提取。

  1. 是的,它將使用緩存版本的記錄而不是數據庫版本。
  2. 如果否,它將使用數據庫版本。

P.S.高速緩存的記錄的生命週期將持續到DBContext被釋放。

0

只要你在這一行獲得值1,呼叫到DB

string s1 = ents.first().Value1; 

然後它保持在內存中的對象(與值2一起)製成。當您嘗試訪問Value2時,它不會再次調用數據庫。

+0

然後我應該怎麼做才能強制它再次連接到數據庫? – mannok

+0

它的博客上說每次我們嘗試訪問實體時,只要它不返回IQueryable對象,它就會連接到數據庫?或者我解釋錯了?謝謝! – mannok