NHibernate: Самый простой способ вернуть объект с коллекцией постраничных детей? - PullRequest
3 голосов
/ 26 ноября 2010

Я хочу вернуть один родительский объект с дочерней коллекцией, загруженной запрошенной страницей (подмножеством) дочерних объектов. Какой лучший способ достичь этого? Фильтры? Возможно ли это с помощью запроса ICriteria?

Я использую .SetFirstResult () и .SetMaxResults (), чтобы выполнить разбиение на страницы для коллекций результатов совокупного корня, но возможно ли использовать это в совокупности с корневым каталогом для выбора страницы дочерних результатов?

Что-то в этом роде:

public class Parent{
int Id;
IList<Child> Children;
}


public Parent GetWithPagedChildren(int id, int page, int pageSize, out int count)
{
    //Query

    return Parentresult; //With one page of children populated.
}

UPDATE:

На самом деле, требование быстрой загрузки не так важно. Я просто хочу, чтобы выгружаемое подмножество дочерних объектов загружалось при доступе к ним.

Ответы [ 2 ]

4 голосов
/ 26 ноября 2010

Вы не можете пейджировать и объединять дочерние коллекции в одном запросе.Но вы можете:

  • Использовать запрос, чтобы получить (разбитых на страницы) родителей и один, чтобы загрузить все коллекции для этих родителей (для некоторых концепций прочитайте http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx)
  • Установите batch-size в коллекциях на размер вашей страницы.Это будет выполнено более или менее так же, но автоматически.Есть даже патч, который позволяет изменять это динамически: https://nhibernate.jira.com/browse/NH-2316

Обновление (для новых требований):

Как вы прочитали, вы можетеиспользуйте session.CreateFilter для фильтрации / сортировки / просмотра дочерней коллекции.Это работает и поддерживается везде.

Кроме того, есть патч ( NH-2319 ; я преобразую в надстройку, так как он вряд ли будет принят в транке), который позволяет использоватьЛинк за это.Он ограничен некоторыми типами коллекций и требует, чтобы отношения были двунаправленными, но допускает следующее:

var parent = GetParent();
var secondPageOfChildrenByName = parent.Children.AsQueryable()
                                                .OrderBy(c => c.Name)
                                                .Skip(PageSize * 1)
                                                .Take(PageSize)
                                                .ToList();
1 голос
/ 30 ноября 2010

Просто прочитайте этот бит в разделе Документация NHibernate «Советы и приемы запросов» (13.13) :

//Collections are pageable by using the IQuery interface with a filter:

IQuery q = s.CreateFilter( collection, "" ); // the trivial filter
q.setMaxResults(PageSize);
q.setFirstResult(PageSize * pageNumber);
IList page = q.List();

Я пока не совсем уверен, как это будет работать сдочерняя коллекция, но попробую и обновлю этот ответ.

...