C# NHibernate和DTO从分层数据返回特定数据

C# NHibernate和DTO从分层数据返回特定数据,c#,nhibernate,dto,resulttransformer,C#,Nhibernate,Dto,Resulttransformer,我有几个表需要从中提取数据,但我不需要所有表中的所有数据。例如,我有一个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 Shi

我有几个表需要从中提取数据,但我不需要所有表中的所有数据。例如,我有一个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; }
}
公共类秩序
{
公共虚拟整数ID{get;set;}
公共虚拟优惠券耦合ID{get;set;}
公共虚拟状态StatusID{get;set;}
公共虚拟地址ShippingAddressID{get;set;}
公共虚拟地址BillingAddressID{get;set;}
公共虚拟ICollection OrdertHistories{get;set;}
公共虚拟ICollection OrderNotes{get;set;}
公共虚拟ShippingDetails ShippingDetail{get;set;}
公共虚拟ICollection订单产品{get;set;}
}
此外,这些子对象中的一些又有子对象,在最极端的情况下,我们有一个4层对象层次结构

所以我的问题是,我需要从这些子对象中检索一个只包含特定信息的对象列表

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

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

我真的很感激任何关于我应该从哪里开始以及应该使用什么的指导

问候


Noel.

你所说的是投影

要将对象图投影到展开的结构,请使用例如linq select

现在,在select中,您可以直接使用Dto创建强类型数据,也可以只返回一个
IEnumerable
,其中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();

那么,使用projection是否只从DB中检索数据,还是检索所有数据并在返回的列表上执行“projection”呢?此外,我还考虑使用HNibernate从SqlView中提取数据。因此,我不需要使用NHibernate来整平数据,而只需要在SQL中这样做。如果可能的话,Nhibernate将生成一条SQL语句,只检索所需的数据。你必须尝试一下,也许你必须优化你的映射。但首先,您必须尝试
仅选择所需的列,并调查生成的查询。。。是的,您可以查询视图,但必须单独映射视图。。。只有在真的有必要的时候我才会这么做。