你如何避免SubSonic的n + 1问题?

时间:2009-01-12 17:54:20

标签: asp.net orm subsonic

Ayende有一个blog post详细说明如何解决nHibernate中的“n + 1”问题。从本质上讲,问题是:

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

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

根据我的理解,SubSonic生成的类默认是lazyload(我不想完全关闭它,因为它在大多数情况下都很有用,只是没有这个)。这意味着每次执行内部循环时(即访问post.Comments时),必须向数据库发送单独的查询以检索注释。

因此,如果您有80篇博文,那是获得博客帖子列表的1个查询,那么就会有80个查询来获取每个帖子的评论。但是,如果评论是急切加载的,那么这将减少为1个查询。

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

3 个答案:

答案 0 :(得分:2)

除非您创建一个查询以根据帖子ID从评论中进行选择,否则我认为没有办法对抗它。这会让你减少到两个。一个查询用于选择所需的帖子ID,另一个用于获取帖子ID列表的所有评论。

答案 1 :(得分:1)

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

答案 2 :(得分: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