NHibernate: Как выбрать корневую сущность в проекции

Айенде описывает действительно отличный способ получить количество страниц и конкретную страницу данных в одном запросе здесь:

http://ayende.com/blog/2334/paged-data-count-with-nhibernate-the-really-easy-way

Его метод выглядит так:

IList list = session.CreateQuery("select b, rowcount() from Blog b")
              .SetFirstResult(5)
              .SetMaxResults(10)
              .List();

Единственная проблема в этом примере на HQL, и мне нужно сделать то же самое в запросе ICriteria. Чтобы добиться аналога с ICriteria, мне нужно сделать что-то вроде:

IList list = session.CreateCriteria<Blog>()
              .SetFirstResult(5)
              .SetMaxResults(10)
              .SetProjection(Projections.RootEntity(), Projections.SqlFunction("rowcount", NHibernateUtil.Int64))
              .List();

Проблема в том, что нет такой вещи, как Projection.RootEntity(). Есть ли способ выбрать корневую сущность в качестве одной из проекций в списке проекций?

Да, я знаю, что могу просто использовать CriteriaTransform.TransformToRowCount(), но для этого потребуется выполнить запрос дважды - один раз для результатов и один раз для количества строк. Использование Futures может немного помочь, сократив его до одного приема, но он все еще выполняет запрос дважды на SQL Server. Для интенсивных запросов это недопустимо. Я хочу избежать накладных расходов и вернуть количество строк и результаты в одном запросе.

Основной вопрос: используя ICriteria, есть ли способ выбрать корневую сущность И какую-то другую проекцию одновременно?

РЕДАКТИРОВАТЬ: некоторые ссылки по теме:

https://nhibernate.jira.com/browse/NH-1372?jql=text%20~%20%22entity%20projection%22

https://nhibernate.jira.com/browse/NH-928

1 ответ

Я реализовал RootEntityProjection. Вы можете попробовать код, который вы можете найти по адресу: http://weblogs.asp.net/ricardoperes/archive/2014/03/06/custom-nhibernate-criteria-projections.aspx. Дайте мне знать, если это помогло.

Другие вопросы по тегам