NHibernate: получение нескольких сущностей с подмножеством дочерней коллекции? - PullRequest
2 голосов
/ 16 января 2010

Мои занятия выглядят примерно так (я включаю только соответствующие свойства):

public class Order 
{
   public virtual Customer Customer { get; set; }
   public virtual IEnumerable<OrderLine> OrderLines { get; set; }
}

public class OrderLine 
{
   public virtual string Product { get; set; } // Simplified
}

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

Customer someCustomerObject = ...;
var criteria = DetachedCriteria.For<Order>().Add(Restrictions.Eq("Customer", someCustomerObject);

Но как мне поручить NHibernate с нетерпением получать первые 10 строк заказов для каждого заказа, полученного по вышеуказанным критериям?

Я пытался использовать фильтр на основе следующего примера (взятого из документации Nhibernate):

session.CreateFilter( lazyCollection, "").SetFirstResult(0).SetMaxResults(10).List();

Но когда я даю Order.OrderLines методу CreateFilter, он сначала извлекает все строки порядка, а затем получает 10 первых строк порядка, а это не то, что мне нужно. Я также пытался объединить это с звонком на NHibernateUtil.Initialize безрезультатно.

Как мне создать отдельный критерий для этой проблемы? Или, если это не совсем возможно, как получить для каждого заказа только 10 первых результатов без извлечения всей коллекции?

1 Ответ

0 голосов
/ 20 декабря 2010

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

<set name="OrderLines" table="OrderToOrderLine" batch-size="10">
    <key column="OrderId"/>
    <one-to-many class="OrderLine"/>
</set>

Дополнительная информация приведена на: Картография NHibernate - Коллекции

...