如何避免SubSonic的n + 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中有没有办法解决这个问题?
答
除非您创建一个查询来根据帖子ID进行评论,否则我不认为有办法解决这个问题。这会让你减少到两个。一个查询选择您想要的发布ID,然后另一个查询获取该发布ID列表的所有评论。
答
我认为你应该做的是创建一个部分类方法,将获得所有的评论。不是很干净,但应该工作。
答
我也使用部分类和负载相关的表类,像这样:
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
嗯。那真不幸。那么如果你有一个GridView绑定到一个BlogPostCollection并且你想显示那个BlogPost的注释数量呢? – 2009-01-12 18:20:09