1

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でこの問題に対処する方法はありますか?

4

3 に答える 3

2

投稿 ID に基づいてコメントから選択するクエリを作成しない限り、これに対抗する方法はないと思います。これで2人減ります。1 つのクエリで必要な投稿 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 に答える