1

多くの投稿が含まれるトピック マップがあります。

 public TopicMap()
{
    Cache.ReadWrite().IncludeAll();

    Id(x => x.Id);
    Map(x => x.Name);
    *lots of other normal maps*

    References(x => x.Category).Column("Category_Id");
    References(x => x.User).Column("MembershipUser_Id");
    References(x => x.LastPost).Column("Post_Id").Nullable();

    HasMany(x => x.Posts)
        .Cascade.AllDeleteOrphan().KeyColumn("Topic_Id")
        .Inverse();

*And a few other HasManys*
}

最新のページ トピックを取得し、ループしてデータといくつかの投稿データを表示するクエリを作成しました (子投稿の数など)。ここにクエリがあります

    public PagedList<Topic> GetRecentTopics(int pageIndex, int pageSize, int amountToTake)
    {
        // Get a delayed row count
        var rowCount = Session.QueryOver<Topic>()
                        .Select(Projections.RowCount())
                        .Cacheable().CacheMode(CacheMode.Normal)
                        .FutureValue<int>();

        var results = Session.QueryOver<Topic>()
                            .OrderBy(x => x.CreateDate).Desc
                            .Skip((pageIndex - 1) * pageSize)
                            .Take(pageSize)
                            .Cacheable().CacheMode(CacheMode.Normal)
                            .Future<Topic>().ToList();

        var total = rowCount.Value;
        if (total > amountToTake)
        {
            total = amountToTake;
        }

        // Return a paged list
        return new PagedList<Topic>(results, pageIndex, pageSize, total);
    }

これで SQLProfiler を使用すると、トピックをループすると、親トピックからすべての投稿を取得するために db ヒットが実行されます。したがって、10 個のトピックがある場合、投稿を取得するときに 10 個の DB ヒットを取得します。

このクエリを変更して、単一のクエリで投稿も取得できますか? ある種の参加だと思いますか?

4

2 に答える 2

1

プロパティ マッピングを使用Fetch.xxxして熱心なフェッチを定義できます。HasMany利用可能なオプションはFetch.Join()Fetch.Select()およびFetch.SubSelect()です。取得の各タイプの詳細については、NHibernate のドキュメントを参照してください。

HasMany(x => x.Posts)
    .Cascade.AllDeleteOrphan().KeyColumn("Topic_Id")
    .Fetch.Join()
    .Inverse();
于 2012-07-03T21:58:30.397 に答える
0

私の意見では、最良の方法は、コレクションに妥当なサイズを定義することbatch-sizeです (経験則: デフォルトの親ページ サイズ)。

そうすれば、親アイテムを取得した後、反復する子コレクション タイプごとに 1 つのクエリを取得できます。

于 2012-07-03T23:33:37.720 に答える