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