0

NHibernate を使用して、データベースのほぼ全体のグラフをロードする必要があります (本当の理由から、信じてください)。エンティティはそれほど多くありませんが、グラフは複雑です。

私のグラフは次のようになります。

  • エンティティA
  • | |
  • --> エンティティ B
  • | |
  • --> リスト
    • | |
    • --> エンティティ D
    • | |
    • --> リスト
      • | |
      • --> エンティティF

うーん... わかります。

可能な限り少ないクエリとラウンドトリップですべてをロードし、N + 1 をまったく選択しないようにしたいと考えています。また、グラフとして保持したいので、後で簡単にループできます。

私の最良の選択肢は何ですか?NHibernateUtil.Initialize()? Fetch()/FetchMany()? 将来/マルチクエリ?

ちょっと迷ったけど、複数回に分けてやらなきゃいけないんじゃないかな。しかし、何が最も効率的でしょうか?

おまけ: すべてのエンティティに IsPublished プロパティがあります。すべてのエンティティまたは公開されているエンティティのみをロードできるようにしたい。

編集

最後に私はこれを試しました:

var applicationFields = NHibernateSession.Current.Query<ApplicationField>().Where(af => af.Ispublished)
.FetchMany(af => af.Illustrations)
.ThenFetch(i => i.InteractiveConfiguration)
.ThenFetchMany(ic => ic.UniqueSellingPoints)
.ThenFetchMany(usp => usp.Pictures)
.ToList();

私のグラフがどのように見えるかを考えると、それはまったく問題ないと思います。また、同じレベルに複数のコレクションがありません。これは、私が知る限り、デカルト積を誘発するものです。

尋ねた人にとって、それは再帰の問題ではありません。それ以外の場合は、SQL Server CTE を使用します。また、エンティティを更新していません。単純に読むだけです(オフラインアプリの場合)。

しかし、私は「ボーナス」の質問については無知です。EF がフィルターに基づいて部分的なコレクションを読み込めることは知っていますが、NH ではそれができないようです。

4

1 に答える 1

1

簡単な答え:ユースケースと予想されるリストサイズに応じて、Fetch()/ FetchMany()とFuture()の組み合わせ

于 2012-01-30T09:01:50.327 に答える