setfirstresult & setmaxresult в детской коллекции - PullRequest
1 голос
/ 17 марта 2010

У меня есть, и сущность позволяет назвать это Entity, а Child collection Children. У меня есть экран, на котором у пользователя есть информация Entity, и список с коллекцией Children, но эта коллекция может быть очень большой, поэтому я подумал об использовании подкачки: получить первые 20 элементов и ленивая загрузка следующее, только если пользователь явно нажимает следующую кнопку.

Итак, я создал в хранилище сущностей функцию с такой подписью:

IEnumerable<Child> GetChildren(Entity entity, int actualPage, int numberOfRecordsPerPage)

Мне нужно использовать setfirstresult и setmaxresult не в Agregate root Entity, а в дочерней коллекции. Но когда я использую эти две конфигурации, они всегда ссылаются на тип сущности запроса HQL / Criteria.

Другой альтернативой может быть создание запроса HQL / Criteria для типа Child, установка максимального и первого результата, а затем фильтрация тех, кто находится в коллекции дочерних объектов (с помощью подзапроса). Но я не смог сделать этот фильтр. Если бы это была двунаправленная ассоциация (Ребенок, ссылающийся на родительскую сущность), это было бы проще.

Есть предложения?

Любой

Ответы [ 2 ]

0 голосов
/ 20 марта 2010

это просто с CreateFilter

session.CreateFilter(entity.children, "")
    .SetFirstResult(0)
    .SetMaxResults(20)
    .List();

http://knol.google.com/k/fabio-maulo/nhibernate-chapter-16/1nr4enxv3dpeq/19#

0 голосов
/ 17 марта 2010

Один из подходов заключается в создании запроса, который возвращает результаты из обеих таблиц, путем группировки. Этот подход позволит вам применять разбиение на страницы для данных, которые поступят из дочерней коллекции и имеют общий фактор (идентификатор объекта в каждой строке), в то время как вы сохраняете исходную точку (объект Entity). Я имею в виду что-то вроде этого:

public IList<object> GetData(int entityID, int actualPage, int numberOfRecordsPerPage)
        {
            ICriteria criteria = _repository.Session.CreateCriteria<FlowWhatIfProfile>("entity")
                .CreateCriteria("Children", "children", NHibernate.SqlCommand.JoinType.InnerJoin)
                .Add(Restrictions.Eq("children.EntityID", entityID));           

            ProjectionList pl = Projections.ProjectionList();
            pl.Add(Projections.GroupProperty("children.Id"));
            pl.Add(Projections.GroupProperty("children.Property1"));
            pl.Add(Projections.GroupProperty("children.Property2"));
            pl.Add(Projections.GroupProperty("children.Property2"));
            pl.Add(Projections.GroupProperty("entity.Id"));

            return criteria.SetProjection(pl)
                .SetFirstResult(actualPage * numberOfRecordsPerPage)
                .SetFetchSize(numberOfRecordsPerPage)
                .List<object>();
        }

Недостатком было бы то, что ваши возвращенные данные представляют собой список массивов (вам придется преобразовать object в object[]), но вы можете преодолеть это, используя функциональность AliasToBean, чтобы NHibernate не проецировал эти массивы в строго типизированные объекты что вы определяете.

...