3

次のような子コレクションも含むデータ層から DTO を返したいと思います。

Audio
 - Title
 - Description
 - Filename
 - Tags
     -  TagName
 - Comments
     -  PersonName
     -  CommentText

ここまでは基本的なクエリですが、子コレクションをエンティティから DTO に変換する方法がわかりません。

var query = Session.CreateCriteria<Audio>("audio")
            .SetProjection(
                Projections.ProjectionList()
                    .Add(Projections.Property<Audio>(x => x.Title))
                    .Add(Projections.Property<Audio>(x => x.Description))
                    .Add(Projections.Property<Audio>(x => x.Filename))
            ).SetResultTransformer(new AliasToBeanResultTransformer(typeof(AudioDto)))
            .List<AudioDto>();

これは可能ですか、またはこれを行う別の推奨される方法はありますか?

更新: シナリオについてもう少し情報を追加したいだけです...オーディオ項目のリストを、現在ログインしているユーザーに、タグ、コメントなどの関連エンティティと共に返したいと思います...これらはかなり簡単ですマルチクエリ/フューチャーを使用。

ただし、ユーザーにオーディオ アイテムを表示するときに、他の 3 つのオプションもユーザーに表示したいと考えています。

  • このオーディオ アイテムをお気に入りのリストに追加した天気
  • 彼らがこのオーディオを「高く評価」した天気
  • ログインしたユーザーがこの音声の所有者を「フォロー」している天気
Favourites : Audio -> HasMany -> AudioUserFavourites

Thumbs Up : Audio -> HasManyToMany -> UserAccount

Following Owner : Audio -> References -> UserAccount ->

多対多 -> ユーザーアカウント

これが理にかなっていることを願っています...そうでない場合は、もう一度説明します...返された各Audioエンティティのこれらの追加の詳細を熱心にロードするにはどうすればよいですか...20ページのこの情報もすべて必要です。

バッチ フェッチを調べましたが、これは、ログインしているユーザーだけが親指を立てたかどうかを確認するのではなく、オーディオ エンティティごとにすべての親指を立てているようです。

とりとめのない申し訳ありません:-)

ポール

4

1 に答える 1

2

コレクションとコレクションAudioの両方が設定された状態でオブジェクトをフェッチする場合は、Aydende Rahien のブログ ( http://ayende.com/blog/4367/eagerly-loading-entity-associations-effectively-with-nhibernate ) を参照してください。TagsComments

これには DTO を使用する必要はありません。Audioコレクションがデフォルトで遅延ロードされている場合でも、コレクションのリストを取得できます。2 つの将来のクエリを作成します。1 つ目はタグに結合されたオーディオをフェッチし、2 つ目はコメントに結合されたオーディオをフェッチします。これが機能するのは、2 番目のクエリ結果が処理されるまでに、セッション キャッシュに既にAudioオブジェクトが含まれているためです。NHibernate は、再ハイドAudioレートする代わりにキャッシュから を取得し、2 番目のコレクションに入力します。

これには将来のクエリを使用する必要はありません。2 つのクエリを順番に実行するだけでも機能しますが、future を使用すると、データベースへのラウンド トリップが 1 回だけになるため、高速になります。

于 2011-06-15T16:09:01.133 に答える