2012-01-27 26 views
0

NHibernateを使用している私のデータベースのほとんどのグラフをロードする必要があります(本当の理由で、信頼してください)。それほど多くのエンティティはありませんが、グラフはまるで畳み込まれています。 |NHibernate:コレクションのコレクションのコレクション

  • エンティティA
  • 私のグラフは次のようになります

  • - > EntityB
  • |
  • - >リスト
    • |
    • - > EntityD
    • |
    • - >リスト
      • |
      • - > EntityF

うーん...あなたのアイデアを得ます。

できるだけ少ないクエリと往復ですべてを読み込みたい場合は、N + 1を選択しないでください。また、グラフとして保存したいので、後で簡単にループすることができます。

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

私は紛失していますが、私は複数の操作でそれを行う必要があると思います。しかし、最も効率的なものは何でしょうか?

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

EDIT

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

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(); 

私のグラフの見え方を考慮すると、私はそれが非常にOKだと思います。また、同じレベルで複数のコレクションを持っているわけではありません。これは私が知る限りデカルト製品を誘導するものです。

頼まれた人には、再帰問題ではありません。それ以外の場合は、SQL Server CTEを使用しています。また、私はエンティティを更新していません。それはちょうどプレーンな(オフラインアプリのための)読み込みです。

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

+0

に可能な複製を期待http://stackoverflow.com/questions/2167866/eager-loading -a-tree-in-nhibernate – autonomatt

+0

現在のマッピングとクラスを投稿できますか?すべてのエンティティが同じタイプのものであると仮定します。 –

+0

読み込んだエンティティの多くを更新する予定ですか?要約タイプ情報を取得するために、このデータをすべてロードしていますか?ビューまたはnhibernateクエリは、これを助けるかもしれません。私の意見では、どのようにデータを使用しているかによって大きく変わります。 –

答えて

1

短い答え:フェッチ()/ FetchMany()の組み合わせと未来()ユースケースに応じて、リスト・サイズ

関連する問題