Фильтровать дочернюю коллекцию, возвращенную с помощью Aggregate Root с использованием Nhibernate - PullRequest
5 голосов
/ 29 октября 2008

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

Ответы [ 4 ]

3 голосов
/ 29 октября 2008

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

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

Атрибут 'where' является произвольным SQL.

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

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

orderRepository.GetOrders(int customerId, OrderStatus[] statuses)
1 голос
/ 15 мая 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>();

что-то в этом роде.

1 голос
/ 15 мая 2009

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

1 голос
/ 30 октября 2008

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

session.CreateCriteria( typeOf(Order) )
    .Add( Restrictions.Eq("Shipped", shippedStatus ) )
    .Add( Restrictions.Eq("Customer", requiredCustomer) )
    .List<Order>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...