我需要在DTO中填充一个集合属性,但我无法找到有关此操作的任何信息。
我试着这样做:
ICriteria selectCriteria = Session.CreateCriteria<DataRun>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("SomeCollection"), "Collection"))
.SetResultTransformer(Transformers.AliasToBean<MyDto>());
但MyDto.Collection始终为null。我做错了,这甚至可能吗?
另外,我最初计划使用SubQuery这样做,所以我可以用其他DTO填充我的DTO集合,但这不起作用,因为子查询的结果有超过1行(应该如此)而Sqlit确实如此不喜欢(抛出异常)。在这里做什么是正确的?
答案 0 :(得分:0)
我使用以下语法检索了项目中的集合属性:
public IList<ChildCollectionType> GetChildObjectsByParentId(Int32 id)
{
ISession session = GetSession();//Get NHibernate session routine
return session.Load<ParentDTO>(id).ChildCollectionProperty;
}
其中 id 是父对象的键。
答案 1 :(得分:0)
您可以使用自定义转换。
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]
};
}
}