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中有没有办法解决这个问题?
答案 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