Ayendeには、nHibernateの「n+1」問題と戦う方法を詳しく説明したブログ投稿があります。本質的に、問題はこれです:
「BlogPosts」と「Comments」の2つのテーブルがあり、それらの間に1対多の関係があるとします(つまり、各BlogPostは複数のコメントを持つことができます)。ここで、次のネストされたforループを実行するとします。
foreach (BlogPost post in blogposts)
{
foreach (Comment comment in post.Comments)
{
// Do something
}
}
私が理解していることから、SubSonicが生成するクラスはデフォルトでlazyloadです(これはほとんどの状況で役立つので、これを完全にオフにしたくはありませんが、これだけではありません)。つまり、内部ループが実行されるたびに(つまり、post.Commentsにアクセスするとき)、コメントを取得するために別のクエリをデータベースに送信する必要があります。
したがって、80のブログ投稿がある場合、それはブログ投稿のリストを取得するための1つのクエリであり、次にそれらのそれぞれのコメントを取得するための80のクエリです。ただし、コメントが熱心に読み込まれた場合、これは1つのクエリに削減されます。
現在、SubSonicでこの問題に対処する方法はありますか?