2

我需要在 DTO 中填充一个集合属性,但我无法找到有关执行此操作的任何信息。

我试着这样做:

ICriteria selectCriteria = Session.CreateCriteria<DataRun>()
            .SetProjection(Projections.ProjectionList()
                .Add(Projections.Property("SomeCollection"), "Collection"))
            .SetResultTransformer(Transformers.AliasToBean<MyDto>());

但 MyDto.Collection 始终为空。我做错了吗,这甚至可能吗?

此外,我最初计划使用 SubQuery 执行此操作,因此我可以用其他 DTO 填充我的 DTO 集合,但这不起作用,因为子查询的结果有超过 1 行(应该如此)并且 Sqlit 不喜欢那样(抛出异常)。在这里做什么是正确的?

4

2 回答 2

0

我使用以下语法在我的项目中检索了集合属性:

public IList<ChildCollectionType> GetChildObjectsByParentId(Int32 id)
{
    ISession session = GetSession();//Get NHibernate session routine
    return session.Load<ParentDTO>(id).ChildCollectionProperty;
}

其中id是父对象的键。

于 2011-04-19T08:27:02.463 回答
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]
            };
        }
    }
于 2016-11-26T12:31:56.140 回答