Я бы сказал, что не имеет смысла говорить о «Заказе, который содержит только элементы Заказа, которых нет в наличии». «Заказ» (я предполагаю) представляет полный список того, что заказал клиент; если вы фильтруете этот список, вы больше не имеете дело с Орденом как таковым, вы имеете дело с отфильтрованным списком OrderItems.
Я думаю, что возникает вопрос, действительно ли вы хотите рассматривать Заказы как Совокупный корень или хотите ли вы иметь возможность извлекать произвольные списки OrderItems из слоя доступа к данным.
Вы сказали, что фильтрация элементов после их возвращения из базы данных будет слишком дорогой, но если вы не усредняете сотни или тысячи OrderItems для каждого заказа (или есть что-то еще особенно интенсивное в работе с большим количеством OrderItems Возможно, вы пытаетесь оптимизировать преждевременно и усложняете вещи, чем они должны быть. Я думаю, что если вы оставите Order в качестве совокупного корня и фильтра в своей доменной логике, ваша модель станет более чистой для работы.
Если это действительно не случай, и вам нужно отфильтровать базу данных, то вы можете рассмотреть возможность создания отдельного репозитория OrderItem, который бы обеспечивал запросы типа "дай мне все OrderItems для этого заказа которых нет в наличии ". Затем вы должны вернуть их как IList<OrderItem>
(или IEnumerable<OrderItem>
), поскольку они не полный ордер, а скорее некоторая отфильтрованная коллекция OrderItems.