2009-01-12 78 views
1

Ayende有一个blog post详细说明如何对付nHibernate中的“n + 1”问题。实质上,问题是这样的:如何避免SubSonic的n + 1问题?

假设您有两个表格“BlogPosts”和“Comments”,它们之间有一对多的关系(即每个BlogPost可以有多个注释)。现在,让我们说你要执行下面的嵌套的循环:

foreach (BlogPost post in blogposts) 
{ 
    foreach (Comment comment in post.Comments) 
    { 
     // Do something 
    } 
} 

从我个人理解,这亚音速默认生成的lazyload类(我不想彻底关闭这个功能,因为它是有用大多数情况下,只是不是这个)。这意味着每次执行内部循环(即访问post.Comments时),都必须将单独的查询发送到数据库以检索评论。

因此,如果您有80条博客文章,即1条查询获取博客文章列表,然后80条查询获得每条评论的评论。但是,如果注释被加载,这将被减少为1个查询。

在SubSonic中有没有办法解决这个问题?

回答

2

除非您创建一个查询来根据帖子ID进行评论,否则我不认为有办法解决这个问题。这会让你减少到两个。一个查询选择您想要的发布ID,然后另一个查询获取该发布ID列表的所有评论。

+0

嗯。那真不幸。那么如果你有一个GridView绑定到一个BlogPostCollection并且你想显示那个BlogPost的注释数量呢? – 2009-01-12 18:20:09

1

我认为你应该做的是创建一个部分类方法,将获得所有的评论。不是很干净,但应该工作。

0

我也使用部分类和负载相关的表类,像这样:

Partial Public Class Book 

    Private _Author as Database.Author 
    Property Author() as Database.Author 
     Get 
     If _Author is nothing then 
      ' Load the author class here. 
     End if 
     return _Author 
     End get 
     Set 
     '.... 
     End Set 
    End Property 

End Class