Ayende opisuje naprawdę świetny sposób na liczbę stron i konkretną stronę danych w jednym zapytaniu tutaj:NHibernate: Jak wybrać podmiot korzeniowy w projekcji
http://ayende.com/blog/2334/paged-data-count-with-nhibernate-the-really-easy-way
Jego metoda wygląda :
IList list = session.CreateQuery("select b, rowcount() from Blog b")
.SetFirstResult(5)
.SetMaxResults(10)
.List();
jedynym problemem jest to przykładem jest HQL i muszę zrobić to samo w zapytaniu ICriteria. Aby osiągnąć równoważny ICriteria, muszę zrobić coś takiego:
IList list = session.CreateCriteria<Blog>()
.SetFirstResult(5)
.SetMaxResults(10)
.SetProjection(Projections.RootEntity(), Projections.SqlFunction("rowcount", NHibernateUtil.Int64))
.List();
Problemem jest to, nie ma czegoś takiego jak Projections.RootEntity(). Czy istnieje sposób, aby wybrać element główny jako jeden z rzutów na liście projekcji?
Tak, wiem, że mógłbym tylko użyć CriteriaTransformTransformToRowCount(), ale to wymagałoby dwukrotnego wykonania zapytania - raz dla wyników i raz dla liczby wierszy. Korzystanie z kontraktów Futures może trochę pomóc, redukując je do jednej podróży w obie strony, ale wciąż wykonuje kwerendę dwukrotnie na serwerze SQL. W przypadku intensywnych zapytań jest to niedopuszczalne. Chcę uniknąć obciążenia i zwrócić liczbę wierszy i wyniki w tym samym zapytaniu.
Podstawowe pytanie brzmi: za pomocą ICriteria, czy istnieje sposób na wybranie jednostki głównej ORAZ innej projekcji w tym samym czasie?
EDIT: niektóre powiązane linki:
https://nhibernate.jira.com/browse/NH-1372?jql=text%20~%20%22entity%20projection%22
https://nhibernate.jira.com/browse/NH-928