1

Ayende 有一篇文详细介绍了如何解决 nHibernate 中的“n+1”问题。本质上,问题是这样的:

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

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

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

因此,如果您有 80 篇博文,则需要 1 次查询来获取博文列表,然后是 80 次查询来获取每篇博文的评论。但是,如果评论是预先加载的,则这将减少为 1 个查询。

目前有什么方法可以解决 SubSonic 中的这个问题吗?

4

3 回答 3

2

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

于 2009-01-12T17:59:31.747 回答
1

我认为您应该做的是创建一个部分类方法来获取所有评论。不是很干净,但应该可以。

于 2009-01-16T07:00:21.360 回答
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
于 2009-04-04T10:39:14.243 回答