Как реализовать пейджинг в NHibernate с помощью запроса левого соединения - PullRequest
2 голосов
/ 27 марта 2010

У меня есть запрос NHibernate, который выглядит следующим образом:

        var query = Session.CreateQuery(@"
              select o
              from Order o
                left join o.Products p
              where
                (o.CompanyId = :companyId) AND
                (p.Status = :processing)
              order by o.UpdatedOn desc")
              .SetParameter("companyId", companyId)
              .SetParameter("processing", Status.Processing)
              .SetResultTransformer(Transformers.DistinctRootEntity);

        var data = query.List<Order>();

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

Я знаю о SetMaxResults() и SetFirstResult(), но из-за left join и DistinctRootEntity это может вернуть менее x заказов.

Я также пытался "select distinct o", но созданный для этого sql (используя диалект sqlserver 2008), похоже, игнорирует distinct для страниц после первой (я думаю, this эта проблема).

Каков наилучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 27 марта 2010

В этих случаях лучше всего делать это в двух запросах вместо одного:

  1. Загрузить страницу заказов без объединений
  2. Загрузите эти заказы с их продуктами, используя оператор in

Есть немного более сложный пример на http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx

1 голос
/ 27 марта 2010

Используйте SetResultTransformer (Transformers.AliasToBean ()) и получите данные, которые не являются сущностью.

Другое решение - изменить запрос. Как я вижу, вы возвращаете заказы, продукты которых обрабатываются. Таким образом, вы можете использовать существующее утверждение. Проверьте руководство по nhibernate на 13.11. Подзапросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...