NHibernate和dto从分层数据中返回特定的数据

本文关键字:数据 返回 NHibernate dto 分层 | 更新日期: 2023-09-27 18:19:19

我有几个表,我需要从中提取数据,但我不需要所有表中的所有数据。例如,我有下面的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。

如果你能告诉我从哪里开始,我应该用什么,我将非常感激。

诺尔。

NHibernate和dto从分层数据中返回特定的数据

你所说的叫做投影。

要将对象图投影到一个扁平的结构中,例如使用linq select。

现在,在select中,您可以直接使用Dto创建强类型数据,也可以返回IEnumerable<T>(其中T是动态的)或其他Poco,并将其传递给周围…

投影的简单的例子:假设foo是可查询来自nhibernate…

// 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();