0

目前我正在玩 NH3,它非常适合非常简单的事情。当谈到不那么简单时,我们迷失了。

我正在创建示例电影数据库。我想显示每个电影实体,其中包含与电影相关的类型计数。输出列表应如下所示:

电影ID | 标题 | 首映 | 流派计数

3 | 布拉布拉| 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

我知道这个问题现在已经有几个月了,但我一直在寻找类似的东西并想出了一个解决方案。

在我的场景中,我有一个 Parent 类型,它有一个 Child 类型的子元素和一个名为 OtherChildren 的 AnotherChild 类型的集合。我的摘要包含 Parent 的 Id 和 Name 属性、Child 的 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 回答