如何使用nhibernate获取DTO成员的集合?

时间:2009-07-13 19:44:28

标签: c# nhibernate orm dto

我需要在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确实如此不喜欢(抛出异常)。在这里做什么是正确的?

2 个答案:

答案 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]
            };
        }
    }