代码之家  ›  专栏  ›  技术社区  ›  mockobject

我如何通过nhibernate获得DTO会员的收藏?

  •  2
  • mockobject  · 技术社区  · 15 年前

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

    我试着这样做:

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

    此外,我原本计划用一个子查询来完成这项工作,这样我就可以用其他DTO填充我的DTO集合,但这不会起作用,因为子查询的结果有多行(应该是这样),而Sqlit不喜欢这样(抛出异常)。在这里应该做什么?

    2 回复  |  直到 15 年前
        1
  •  0
  •   Myles J    14 年前

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

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

    身份证件

        2
  •  0
  •   ahankendi    8 年前

    您可以使用自定义转换。

    ICriteria selectCriteria = Session.CreateCriteria<DataRun>()
                .SetProjection(Projections.ProjectionList()
                    .Add(Projections.Property("SomeCollection"), "Collection"))
                .TransformUsing(new CustomTransformer());
    

    这是您的自定义transformer实现

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