我想从我的数据层返回一个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>
我查看了批量提取,但这似乎是为每个音频实体提取所有拇指,而不是检查只有登录用户是否已经翻过它。
抱歉漫无边际: - )
保
答案 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将导致只有一次数据库往返,使其更快。