2012-03-07 18 views
1

私はEF 4.1で複雑な構造を作成しています。非常に単純化されたバージョンは、次のようになります。EFネストされたクエリは別々のスレッドで実行されますか?

var top = from x in _context.top 
      select new TopView 
      { 
      field = top.field, 
      sub = (from y in x.RelatedTable 
        select new SubView 
        { 
         subfield = y.subfield, 
         subsub = (from z in y.AnotherRelatedTable 
           select new SubSubView 
           { 
            subsubfield = z.subsubfield 
           } 
           ) 
        } 
       ) 
      } 

のviewmodelsは、次のようになります。私は私のコントローラで上面図オブジェクトを取得します(ただし、数秒後に、任意のプロパティにアクセスしない場合は

public class TopView { 
    string field { get; set; } 
    IEnumerable<SubView> sub { get; set; } 
} 

public class SubView { 
    string subfield { get; set; } 
    IEnumerable<SubSubView> sub { get; set; } 
} 

public class SubSubView { 
    string subsubfield { get; set; } 
} 

、私の出力を示し:

The thread '<No Name>' (0x1b44) has exited with code 0 (0x0). 
The thread '<No Name>' (0x1448) has exited with code 0 (0x0). 
The thread '<No Name>' (0xf34) has exited with code 0 (0x0). 

さて、サブビューがどのように見えるように、私は最も内側の構造を削除する場合:

    select new SubView 
        { 
         subfield = y.subfield 
        } 

もう一度実行すると、2つの終了メッセージしか取得できません。

各ネストされたクエリは独自のスレッドで実行されますか?メッセージは心配するものですか?

答えて

1

それぞれのネストされたクエリは、独自のスレッドで実行されますか?

メッセージが心配する何かありますか?あなたが心配すべきは何

N+1 problemです。

+0

これらのメッセージがどこから来ているのか、無視するのがなぜ安全であるのか説明できますか? – chris

+0

@chris、私はあなたがVisual Studioデバッガでそれらのメッセージを見ていると思います。すべてのスレッドを表示します。 ASP.NETなどのマルチスレッドアプリケーションで作業していて、デバッグモードで実行している場合、VSはすべてのスレッドをトレースし、マルチスレッドアプリケーションでは要求を処理するためのスレッドが多数あります。それらはすべて0の戻りコードを示しています。つまり、それらのスレッドは正常に完了したことを意味します(私はあなたのワーカーにサービスを提供していると思います)ので、無視しても問題ありません。 –

関連する問題