2012-03-07 49 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 
        } 

並重新運行,我只得到兩個退出消息。

每個嵌套查詢是否在其自己的線程中運行?這些信息是否值得擔憂?

回答

1

每個嵌套查詢是否在其自己的線程中運行?

是消息幾分擔心?

你應該擔心的是N+1 problem

+0

你能解釋這些消息來自哪裏,爲什麼忽略它們是安全的嗎? – chris 2012-03-07 19:04:28

+0

@chris,我推測你在Visual Studio調試器中看到這些消息。它顯示所有線程。當您正在處理多線程應用程序(如ASP.NET)並以調試模式運行時,VS將跟蹤所有線程,並且在多線程應用程序中,您有大量涉及的線程來處理請求。它們都表示返回代碼0意味着那些線程成功地完成了他們應該做的任何事情(我想爲您的工作請求提供服務),因此您可以放心地忽略它們。 – 2012-03-07 19:06:35

相關問題