如何使用 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?

领域实体、DTO 和视图模型

VSCode PyLint 未检测到我的 Python DTO 类成员

如何使用 Fluent NHibernate 从另一个表中获取一列

如何在 UI、BLL、DAL 之间使用 DTO

现在 ASP.NET 动态数据与 Nhibernate 的工作情况如何?