【问题标题】:NHibernate and DTOs to return specific data from hierarchical dataNHibernate 和 DTO 从分层数据返回特定数据
【发布时间】:2014-08-23 07:35:07
【问题描述】:

我有几个表需要从中提取数据,但我不需要所有表中的所有数据。因此,例如,我有以下 Order 对象,其中包含多个子对象和对象集合。

 public class Order
{
    public virtual int ID { get; set; }
    public virtual Coupon CouponID { get; set; }  
    public virtual Status StatusID { get; set; }
    public virtual Address ShippingAddressID { get; set; }
    public virtual Address BillingAddressID { get; set; }    
    public virtual ICollection<OrderShipmentHistory> OrdertHistories { get; set; }
    public virtual ICollection<OrderShipmentNote> OrderNotes { get; set; }      
    public virtual ShippingDetails ShippingDetail { get; set; }
    public virtual ICollection<OrderProduct> OrderProducts { get; set; }
}

这些子对象中的一些又具有子对象,在最极端的情况下,我们有一个 4 层对象层次结构。

所以我的问题是我需要从大多数子对象中检索仅包含特定信息的对象列表。

目前,当我检索订单列表时,我正在撤回所有内容。我使用了延迟加载,所以我不这样做,但我最终需要拉回这些信息,因为我正在访问每个子对象中的至少一条数据。

所以我在想,我可以为我需要的每个数据集合创建 DTO,而不是填充订单列表。我的问题是我不确定从哪里开始。我见过有人使用 DTO 的例子,但只有在他们检索到所有数据后才填充它们。我不想这样做。我只想检索我需要的数据,然后用结果集填充 DTO。

我非常感谢任何关于我应该从哪里开始以及应该使用什么的指导。

问候

诺埃尔。

【问题讨论】:

    标签: c# nhibernate dto resulttransformer


    【解决方案1】:

    你所说的叫做投影。

    要将您的对象图投影到扁平结构,请使用 linq select。

    现在在选择中,您可以直接创建使用 Dto 强类型化的数据,也可以只返回 IEnumerable&lt;T&gt; 其中 T 是动态的或其他一些 Poco 并传递它...

    简单的投影示例:假设 foo 是来自 nhibernate 的 Queryable...

    // Creates anonymous type with one property 'bar'
    var list = foo.Select(p => new { p.bar }).ToList();
    
    // Creates a Dto for each element and set property Bar of the Dto.
    var list = foo.Select(p => new Dto{ Bar = p.bar }).ToList();
    

    【讨论】:

    • 那么使用投影只会从数据库中检索数据,还是检索所有数据并在返回的列表上完成“投影”?
    • 另外,我正在考虑使用 HNibernate 从 SqlView 中提取数据。因此,与其使用 NHibernate 展平数据,我可以在 SQL 中执行此操作。这行得通吗?
    • Nhibernate 将生成一条 SQL 语句,如果可能,它只检索所需的数据。你必须尝试一下,也许你可能需要优化你的映射。但首先您必须尝试select 仅您需要的列并调查生成的查询...是的,您可以查询视图,但您必须单独映射视图...我会的仅在确实有必要时才这样做。
    猜你喜欢
    • 2018-12-03
    • 2011-04-26
    • 2010-11-27
    • 1970-01-01
    • 2014-05-21
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多