如何使用 nhibernate 获取 DTO 成员的集合?
Posted
技术标签:
【中文标题】如何使用 nhibernate 获取 DTO 成员的集合?【英文标题】:How can I get a collection for a DTO member with nhibernate? 【发布时间】:2009-07-13 19:44:27 【问题描述】:我需要在 DTO 中填充一个集合属性,但我无法找到有关执行此操作的任何信息。
我试着这样做:
ICriteria selectCriteria = Session.CreateCriteria<DataRun>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("SomeCollection"), "Collection"))
.SetResultTransformer(Transformers.AliasToBean<MyDto>());
但 MyDto.Collection 始终为空。我做错了吗,这甚至可能吗?
另外,我最初计划使用子查询来执行此操作,因此我可以用其他 DTO 填充我的 DTO 集合,但这不起作用,因为子查询的结果有超过 1 行(应该如此),而 Sqlit 确实如此不像那样(抛出异常)。在这里做什么是正确的?
【问题讨论】:
我认为你正在尝试做一个应该在你的映射中完成的一对多,但我不太确定。你能发布你的映射文件吗? 我正在做一对多,我的映射实体可以正常工作,但我不想让我的映射实体回来,我想要一个具有一堆属性的 DTO以及哪些不是特定于它们将用于的视图。 【参考方案1】:我已使用以下语法在我的项目中检索到集合属性:
public IList<ChildCollectionType> GetChildObjectsByParentId(Int32 id)
ISession session = GetSession();//Get NHibernate session routine
return session.Load<ParentDTO>(id).ChildCollectionProperty;
其中 id 是父对象的键。
【讨论】:
抱歉,我没有正确阅读您的原始问题。我没有意识到您正在尝试使用集合属性填充自定义 DTO。这里还有一些其他帖子,人们对 aliasToBean 有问题,例如 ***.com/questions/4504054/…【参考方案2】:您可以使用自定义转换。
ICriteria selectCriteria = Session.CreateCriteria<DataRun>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("SomeCollection"), "Collection"))
.TransformUsing(new CustomTransformer());
这是您的自定义转换器实现
public class CustomTransformer : IResultTransformer
public System.Collections.IList TransformList(System.Collections.IList collection)
return collection;
public object TransformTuple(object[] tuple, string[] aliases)
return new MyDto
//map your data to dto and convert to data type if needed
YourProperty1 = tuple[0],
YourProperty12 = (int)tuple[1]
;
【讨论】:
以上是关于如何使用 nhibernate 获取 DTO 成员的集合?的主要内容,如果未能解决你的问题,请参考以下文章
[使用Automapper时,我是否也应该展平/映射视图模型的内部objetc?
VSCode PyLint 未检测到我的 Python DTO 类成员