0

多くのエンティティを持つ dtContext と呼ばれる DataContext があります。データベース内のデータが巨大になったので、新しい DataContext を作成すると、データベースからすべてのデータがエンティティにフェッチされるのではないかと考えていました。新規作成が完了するとすぐに、データベースからのデータで満たされたすべてのエンティティを意味しますか? それとも、LINQ クエリからエンティティを呼び出すときにのみデータをフェッチしますか? 例えば:

line 1: dtContext dt = new dtContext();
line 2: IEnumerable<MyEntity> query = from q in dt.MyEntities select q;

MyEntities がデータベースからの実際のデータを表すのはどの行ですか?

4

4 に答える 4

1

イーガーローディングレイジーローディングと呼ばれる機能を参照している場合、これが役立つ場合があります。また、これも役立ちます

于 2012-08-08T13:18:02.817 に答える
1

ToList()クエリを列挙するか、などを呼び出すまで、データベースにクエリを実行しませんToArray()。これはDeferred Executionと呼ばれます。

標準クエリ演算子の多くは、foreach ステートメントを使用して反復処理を行うと、要素を返します。これらの演算子は、基本的に、最初の要素が要求されるまで機能せず、次の要素が要求されるまで一時停止します。返されたクエリが繰り返されるまで、これらのステートメントの内部で作業は実行されません。この遅延実行により、時間のかかる可能性のある作業を実行するタイミングと実行するかどうかを制御できます。

クエリをすぐに実現したい場合は、ToList、ToArray、または結果を返すためにシーケンス全体を列挙する必要があるその他の演算子を呼び出します。

LINQ は、C# 2.0 で追加された言語機能を利用して、反復処理で一度に 1 つの要素を返すメソッドを簡単に記述できるようにしました。yield return ステートメントは基本的に、値を返すことによってループを一時停止し、次に MoveNext が呼び出されたときに中断したところから正確に再開します。

MSDN ライブラリでは、遅延実行を使用するオペレーターを次のように説明しています。

このメソッドは、遅延実行を使用して実装されます。即時の戻り値は、アクションを実行するために必要なすべての情報を格納するオブジェクトです。このメソッドによって表されるクエリは、GetEnumerator メソッドを直接呼び出すか、Visual C# の foreach または Visual Basic の For Each を使用して、オブジェクトが列挙されるまで実行されません。

于 2012-08-08T13:17:08.723 に答える
1

答えはありません。クエリを作成していないため、最初の行はデータを取得しません。クエリを作成したばかりで実行していないため、2 行目もデータを取得しません。結果を反復処理するときにクエリを実行できます (foreach、ToArray()、First() など)。

于 2012-08-08T13:17:31.223 に答える
0

クエリの結果セットを反復しようとするポイント。

データのサブセットを取得する場合は、クエリに where 句を追加します。

于 2012-08-08T13:16:28.417 に答える