2012-03-07 52 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

相关问题