使用 NHibernate 将聚合与实体一起投影

Posted

技术标签:

【中文标题】使用 NHibernate 将聚合与实体一起投影【英文标题】:Projecting aggregates together with Entity using NHibernate 【发布时间】:2010-10-26 23:38:48 【问题描述】:

我有一个非常标准的 Orders 表和一个关联的 OrderRows 表,比如:

Orders
[id] INTEGER
[name] ...

OrderRows
[orderId] INTEGER
[quantity] INTEGER
[unitPrice] SMALLMONEY
[description] VARCHAR(...)

在某些情况下,我想检索订单列表以及总计摘要,但大多数时候我并不关心摘要。

使用 Criteria API,我可以为每个订单创建 [数量]*[单位价格] 的投影,但是如何在同一结果集中同时获得订单和投影?

【问题讨论】:

【参考方案1】:

您可以在实体中计算 Total 并将其存储在数据库中(如果您不想每次都加载所有行)。

【讨论】:

【参考方案2】:

我相信这里的解决方案是创建一个 DTO 类,然后将其用作结果转换。

public class OrderDTO

    int Id;
    // Rest of Orders properties you want

    int LineTotal; // [quantity]*[unitPrice]

    public OrderDTO(int id, /* rest of constructor parameters */);


session.CreateCriteria(typeof(... /* criteria query here */))
    .SetResultTransformer(new AliasToBeanConstructorResultTransormer(typeof(OrderDTO).GetConstructors()[0]));

【讨论】:

以上是关于使用 NHibernate 将聚合与实体一起投影的主要内容,如果未能解决你的问题,请参考以下文章

在 NHibernate 中,我可以使用工厂来构建复杂的聚合对象(实体)吗?

实体框架与 NHibernate - 性能

将 GUID 与 SQL Server 和 NHibernate 一起使用

NHIbernate 的替代品?

如何将 NHibernate 与 System.Tuple 等不可变类型一起使用?

将原生 SQL where 子句应用于实体的 Nhibernate 查询