Мои классы выглядят примерно так (я включаю только соответствующие свойства):
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 OrderLines для каждого заказа. Первая часть проста:
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 первых результатов, не получая всю коллекцию?
Вы можете установить для свойства batch-size
значение 10 в файле сопоставления NHibernate для класса Order. Таким образом, он с нетерпением загружает первые 10 элементов коллекции и ленивы загружает остальные элементы. Я собирал коллекцию следующим образом:
<set name="OrderLines" table="OrderToOrderLine" batch-size="10">
<key column="OrderId"/>
<one-to-many class="OrderLine"/>
</set>
Дополнительная информация, читайте дальше: NHibernate Mapping - Коллекции