1

SQL Serverから多くの結果を返すLinqクエリがあります。データベースONCEからレコードを取得し、DBにアクセスすることなく、ページ内のレコードをオンデマンドでループするだけです。

簡単なクエリを次に示します。

Dim c1 = (From c2 In _db.CategoryRelationShip
        Select c2)

今、ページのどこかで私は:

For Each item In c1

Next

そして再び:

For Each item In c1

Next

これは、すべての For ループでデータベースに何度もアクセスしていることを意味しますか? または、元のLinqがすべてのレコードを取得し、配列/結果をループしているだけですか?

toList() メソッドについて聞いたので、必要かどうか混乱しています...つまり、そうするとどうなりますか:

Dim c1 = (From c2 In _db.CategoryRelationShip
        Select c2).toList()
4

1 に答える 1

2

LINQ は遅延実行を使用します。つまり、データが必要になるまで何も評価されません。この文:

Dim c1 = (From c2 In _db.CategoryRelationShip
          Select c2)

データベースからデータをフェッチしません。Gert Arnoldが他の回答へのコメントにそれを入れたように:

c1発生するのを待っている単なるクエリです(遅延実行)。

あ、はい。を繰り返すだけでは、クエリを 2 回実行しますc1。これは簡単に確認できます。

Dim myCollection As New List(Of Integer)(New () {1, 2})

Dim result = (From c In myCollection
              Select c)

For Each i As Integer In result
    Console.WriteLine(i)    ' Will print 1 and 2
Next

myCollection.Add(3)
Console.WriteLine()

For Each i As Integer In result
    Console.WriteLine(i)    ' Will print 1, 2 and 3
Next

データベースで同じテストを実行できます。

DB を 2 回呼び出すのを避けるために、これを使用.ToList()してクエリを「強制的に」評価し、結果をリストに格納できます。上記の例でを置き換える(From c In myCollection Select c)と、1 と 2 が 2 回出力されます。(From c In myCollectionc Select c).ToList()

于 2013-11-09T21:33:44.043 に答える