NHibernate и DTO для возврата определенных данных из иерархических данных
У меня есть несколько таблиц, из которых мне нужно получить данные, но мне не нужны все данные во всех таблицах. Так, например, у меня есть следующий объект 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; }
}
Кроме того, некоторые из этих дочерних объектов, в свою очередь, имеют дочерние объекты, и в крайнем случае мы имеем четырехуровневую иерархию объектов.
Поэтому моя проблема заключается в том, что мне нужно получить список объектов, которые содержат только конкретную информацию из большинства этих дочерних объектов.
В настоящее время, когда я получаю список заказов, я возвращаю все назад. Я использовал ленивую загрузку, чтобы не делать этого, но в конечном итоге мне нужно будет извлечь эту информацию обратно, так как я получаю по крайней мере один фрагмент данных в каждом из этих дочерних объектов.
Поэтому я подумал, что вместо заполнения списка заказов я мог бы создать DTO для каждого из наборов данных, которые мне нужны. Моя проблема в том, что я не уверен, с чего начать. Я видел примеры людей, использующих DTO, но заполняющих их только после того, как они извлекли все данные. Я не хочу этого делать. Я хочу получить только те данные, которые мне нужны, а затем заполнить DTO наборами результатов.
Я был бы очень признателен за любые указания о том, где я должен начать и что я должен использовать.
С уважением
Ноэль.
1 ответ
То, о чем вы говорите, называется проекцией.
Чтобы спроецировать ваш объектный граф на плоскую структуру, используйте, например, linq select.
Теперь внутри выбора вы можете либо напрямую создать данные, строго типизированные вашим Dto, либо просто вернуть IEnumerable<T>
где T динамический или какой-то другой Poco и передать это вокруг...
Простой пример проекции: допустим, foo - это Queryable из 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();