Ich schreibe eine NHibernate Kriterien, die Daten unterstützt Paging auswählt. Ich verwende die COUNT(*) OVER()
Ausdruck von SQL Server 2005(+), um die Gesamtzahl der verfügbaren Zeilen zu ermitteln, da vorgeschlagen von Ayende Rahien. Ich brauche diese Zahl, um zu berechnen, wie viele Seiten es insgesamt gibt. Das Schöne an dieser Lösung ist, dass ich keine zweite Abfrage ausführen muss, um die Zeilenzahl zu erhalten.
Ich scheine es jedoch nicht zu schaffen, ein funktionierendes Kriterium zu schreiben (Ayende bietet nur eine HQL-Abfrage).
Hier ist eine SQL-Abfrage, die zeigt, was ich will, und sie funktioniert einwandfrei. Beachten Sie, dass ich absichtlich die eigentliche Paging-Logik weggelassen habe, um mich auf das Problem zu konzentrieren:
SELECT Items.*, COUNT(*) OVER() AS rowcount
FROM Items
Hier ist das HQL:
select
item, rowcount()
from
Item item
Beachten Sie, dass die rowcount()
Funktion ist in einem benutzerdefinierten NHibernate-Dialekt registriert und wird aufgelöst in COUNT(*) OVER()
in SQL.
Eine Voraussetzung ist, dass die Abfrage durch ein Kriterium ausgedrückt wird. Leider weiß ich nicht, wie ich das richtig hinbekomme:
var query = Session
.CreateCriteria<Item>("item")
.SetProjection(
Projections.SqlFunction("rowcount", NHibernateUtil.Int32));
Wenn ich eine Projektion hinzufüge, wählt NHibernate nicht item
(wie ohne eine Projektion), sondern nur die rowcount()
während ich beides wirklich brauche. Außerdem kann ich scheinbar nicht projizieren item
als Ganzes, sondern nur seine Eigenschaften, und die möchte ich wirklich nicht alle aufzählen.
Ich hoffe, jemand hat eine Lösung für dieses Problem. Trotzdem vielen Dank.