Я пытаюсь отфильтровать дочернюю коллекцию сводного корня при загрузке с помощью Nhibernate. Загрузите клиента со всеми его заказами, которые были отправлены. Это возможно?
Отфильтровать дочернюю коллекцию, возвращенную с помощью Aggregate Root, с помощью Nhibernate
Ответы (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)
Вы можете посмотреть на это с другой стороны - загрузить все отгруженные заказы для клиента.
session.CreateCriteria( typeOf(Order) )
.Add( Restrictions.Eq("Shipped", shippedStatus ) )
.Add( Restrictions.Eq("Customer", requiredCustomer) )
.List<Order>();
Вы также можете сделать это с помощью HQL, используя session.Filter(customer.Orders, "where this.Status == 'Shipped'");
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>();
что-то такое.