Отфильтровать дочернюю коллекцию, возвращенную с помощью Aggregate Root, с помощью Nhibernate

Я пытаюсь отфильтровать дочернюю коллекцию сводного корня при загрузке с помощью Nhibernate. Загрузите клиента со всеми его заказами, которые были отправлены. Это возможно?


person Community    schedule 29.10.2008    source источник


Ответы (4)


Ну, вы можете показать свойства, которые отфильтрованы на карте, например:

<bag name="shippedOrders" ... where="Status == 'Shipped'" >
   <key column="CustomerId" />
   <one-to-many class="Order" />
</bag>

Атрибут «где» является произвольным SQL.

Теоретически у вас может быть два свойства Customer, Orders и ShippedOrders. Однако я должен сказать, что я этого не делал, и я хотел бы проверить, как NH справляется с каскадированием в этом случае. В любом случае вам придется следить за тем, чтобы при добавлении/удалении новых элементов они корректно добавлялись/удалялись в обе коллекции.

Тот факт, что вы хотите сделать это, заставляет нас задаться вопросом, является ли Order совокупным корнем. В долгосрочной перспективе может быть меньше проблем, если сделать это следующим образом:

orderRepository.GetOrders(int customerId, OrderStatus[] statuses)
person Tim Scott    schedule 29.10.2008
comment
Это повлечет за собой двойную загрузку заказов, даже если для них будут только отдельные объекты. - person kͩeͣmͮpͥ ͩ; 30.10.2008

Вы можете посмотреть на это с другой стороны - загрузить все отгруженные заказы для клиента.

session.CreateCriteria( typeOf(Order) )
    .Add( Restrictions.Eq("Shipped", shippedStatus ) )
    .Add( Restrictions.Eq("Customer", requiredCustomer) )
    .List<Order>();
person kͩeͣmͮpͥ ͩ    schedule 30.10.2008

Вы также можете сделать это с помощью HQL, используя session.Filter(customer.Orders, "where this.Status == 'Shipped'");

person Sebastian Markbåge    schedule 15.05.2009

ICriteria crit = session.CreateCriteria (typeof(Customer));

crit.CreateAlias ("Orders", "o");
crit.Add (Expression.Eq ("o.Status", shippedStatus));
crit.Add (Expression.Eq ("Id", customerId));

return crit.UniqueResult <Customer>();

что-то такое.

person Frederik Gheysels    schedule 15.05.2009