我有几个表需要从中提取数据,但我并不需要所有表中的所有数据。例如,我有以下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。
我真的很感激任何关于我应该从哪里开始以及我应该使用什么的指导。
问候
诺尔。
答案 0 :(得分:1)
你所说的是投影。
要将对象图投影到展平结构,请使用例如linq 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();