0

現在、私はNH3で遊んでいますが、これは本当に単純なことには最適です。それほど単純ではないということになると、私たちは迷子になります。

サンプルの映画データベースを作成しています。映画に関連付けられているジャンルの数ですべての映画エンティティを表示したいと思います。出力リストは次のようになります。

MovieId | タイトル| プレミア| ジャンルカウント

3 | bla bla | 1990-01-01 | 2

SQLを使用すると、次のようになります。

select f.*, isnull(fg.counter, 0) as genres_count
from dbo.movie f left join
(
select id_movie, count(id_genre) as counter
from dbo.movie_genres
group by id_movie
) fg on f.id = fg.id_movie 

ご覧のとおり、これは本当に単純な要約SQLです。

QueryOverを使用してすべての映画のジャンルをカウントする集計:

GenreSummary alias = null;
var genresQuery = QueryOver.Of<MovieGenre>()
.SelectList(lista => lista
.SelectGroup(o => o.Film.Id).WithAlias(() => alias.MovieId)
.SelectCount(o => o.Genre).WithAlias(() => alias.GenresCount))
.TransformUsing(Transformers.AliasToBean<GenreSummary>());

映画クエリ:

var movieQuery = QueryOver.Of<Movie>().ToList();

では、genresQueryをmovieQueryと結合して、サマリーエンティティリストを作成する方法を考えてみましょう。たとえば、MovieSummary(MovieSummaryには追加の列GenresCountがあります)としましょう。QueryOverで実行できますか?NH3でできますか?

-よろしく、マッコ

4

1 に答える 1

0

この質問が数か月前のものであることは知っていますが、似たようなものを探していて、解決策を思いつきました.

私のシナリオでは、タイプ Child の単一の子とタイプ AnotherChild の OtherChildren と呼ばれるコレクションを持つタイプ Parent があります。私の概要には、Parent の Id プロパティと Name プロパティ、子の Name プロパティ、および OtherChildren コレクションの数が含まれています。

IIUC Movie オブジェクトには MovieGenres のコレクションがあり、映画に関する情報とそのジャンルの数を含む概要が必要です。これは、Parent Name と OtherChildren の数を集計オブジェクトに選択することに似ていると思います。

これは私のために働いた:

ParentSummary parentSummary = null;
Child child = null;
IList<AnotherChild> otherChildren = null;

var result = session.QueryOver<Parent>()
  .JoinAlias(x => x.Child, () => child)
  .JoinAlias(x => x.OtherChildren, () => otherChildren)
  .SelectList(list => list
      .SelectGroup(x => x.Id).WithAlias(() => parentSummary.Id)
      .SelectGroup(x => x.Name).WithAlias(() => parentSummary.Name)
      .SelectGroup(() => child.Name).WithAlias(() => parentSummary.ChildName)
      .SelectCount(x => x.OtherChildren).WithAlias(() => parentSummary.OtherChildrenCount))
  .TransformUsing(Transformers.AliasToBean<ParentSummary>())
  .List<ParentSummary>();
于 2011-06-22T16:23:07.197 に答える