NHibernate AliasToBeanResultTransformer&集合

时间:2011-06-15 15:09:15

标签: nhibernate dto eager-loading fetching-strategy

我想从我的数据层返回一个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>();

这是否可能,或者是否有另一种推荐的方法呢?

更新: 只是想添加一些关于我的场景的更多信息...我想将音频项目列表返回给当前登录的用户以及一些相关的实体,例如标签,评论等...这些使用MultiQuery相当简单/未来。

但是,当向用户显示音频项目时,我还想向用户显示3个其他选项:

  • 他们已将此音频项添加到收藏列表中的天气
  • 他们给这个音频'竖起大拇指'的天气
  • 已登录用户的天气是“关注此音频的所有者”
Favourites : Audio -> HasMany -> AudioUserFavourites

Thumbs Up : Audio -> HasManyToMany -> UserAccount

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

ManyToMany - &gt; UserAccount

希望这是有道理的......如果不是我会再次尝试解释......我怎样才能为每个返回的音频实体加载这些额外的细节......我也需要20页的所有这些信息。< / p>

我查看了批量提取,但这似乎是为每个音频实体提取所有拇指,而不是检查只有登录用户是否已经翻过它。

抱歉漫无边际: - )

1 个答案:

答案 0 :(得分:2)

如果您想要同时填充Audio集合和Tags集合的Comments个对象,请查看Aydende Rahien的博客:http://ayende.com/blog/4367/eagerly-loading-entity-associations-efficiently-with-nhibernate

您不需要使用DTO;您可以使用其集合返回Audio的列表,即使默认情况下集合被延迟加载也是如此。您将创建两个未来的查询;第一个将获取连接到标签的音频,第二个将获取连接到评论的音频。它的工作原理是,在处理第二个查询结果时,会话缓存中已经有Audio个对象; NHibernate从缓存中获取Audio而不是重新水化它,然后填充第二个集合。

您不需要为此使用将来的查询;如果您只是按顺序执行两个查询,它仍然有效,但使用future将导致只有一次数据库往返,使其更快。