2016-07-08 11 views
0

LinqToSqlクエリの実行タイミングについて質問したいと思います。私の理解から
このMSDN blogを参照してください、1のIQueryableのプロパティがアクセスされたときにLinqToSqlクエリが唯一私がやった、しかし(のIQueryable/IEnumeration型を返すされていない)
2のIQueryableの機能が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. 

私の質問は:なぜ私はまだS2のための "2" を取得しています!!!!!!!!!!!!!!! ???????? ??????

私の理解から、ents.first().Value2はDBに再度接続し、新しいValue2を取得する必要があります。なぜ私はまだ古い価値を得ているのですか?

私の質問に興味のある方のために先進的に感謝します。

+0

同じデータコンテキストを使用していますか?参照[ここ](https://blogs.msdn.microsoft.com/dinesh.kulkarni/2008/07/02/linq-to-sql-tips-9-understanding-datacontexts-internal-caching/) –

+0

コンパイルできません。コード。 [短く自己完結した正しい例](http://sscce.org/)を書いてください。 – Aron

答えて

0

最後に、私は後ろに働く原理を見つけたと思う。 L2Sは本当にのみDBへの接続などを実行します

LinqToSqlクエリのように働いているとき

  1. のIQueryableのプロパティが
  2. のIQueryableの機能を(これはのIQueryable/IEnumeration型を返すされていない)というアクセスされています

ただし、 L2Sが最初に各レコードのDBからデータをフェッチした後に実行されます。そのPKによってレコードがキャッシュされます。

最終的には、さらにフェッチするたびに。レコードが以前にフェッチされたかどうかをチェックします。

  1. はい、DBバージョンではなく、キャッシュされたバージョンのレコードを使用します。
  2. いいえ、それはDB版を使用します。

P.S.キャッシュされたレコードの存続期間は、DBContextが解放されるまで続きます。

0

とすぐに、この行に値1を得るよう、コールはデシベル

string s1 = ents.first().Value1; 

に作られてそれから(値2と一緒に)メモリ内のオブジェクトを保持します。 Value2にアクセスしようとすると、データベースは再び呼び出されません。

+0

その後、DBに再度接続するために何をする必要がありますか? – mannok

+0

ブログでは、エンティティにアクセスしようとするたびに、IQueryableオブジェクトを返さない限りDBに接続します。それとも私はそれを間違って解釈しましたか?ありがとう! – mannok

関連する問題