Ich schreibe ein NHibernate-Kriterium, das Daten auswählt, die Paging unterstützen. Ich verwende den Ausdruck COUNT(*) OVER()
von SQL Server 2005 (+), um die Gesamtzahl der verfügbaren Zeilen zu erhalten, wie suggested von Ayende Rahien. Ich brauche diese Zahl, um berechnen zu können, wie viele Seiten es insgesamt gibt. Das Schöne an dieser Lösung ist, dass ich keine zweite Abfrage ausführen muss, um die Zeilenanzahl zu erhalten.Das Hinzufügen einer Projektion zu einem NHibernate-Kriterium verhindert die Ausführung der standardmäßigen Entitätsauswahl
Allerdings kann ich nicht scheinen, um ein Arbeitskriterium zu schreiben (Ayende bietet nur eine HQL-Abfrage).
Hier ist eine SQL-Abfrage, die zeigt, was ich will und es funktioniert gut. Beachten Sie, dass ich absichtlich weggelassen, die tatsächliche Paging-Logik auf das Problem zu konzentrieren:
SELECT Items.*, COUNT(*) OVER() AS rowcount
FROM Items
Hier ist die HQL:
select
item, rowcount()
from
Item item
Beachten Sie, dass die rowcount()
Funktion in einem benutzerdefinierten NHibernate Dialekt registriert ist und beschließt, COUNT(*) OVER()
in SQL.
Eine Anforderung ist, dass die Abfrage mithilfe eines Kriteriums ausgedrückt wird. Leider weiß ich nicht, wie es richtig zu machen:
var query = Session
.CreateCriteria<Item>("item")
.SetProjection(
Projections.SqlFunction("rowcount", NHibernateUtil.Int32));
Jedes Mal, wenn ich einen Vorsprung hinzufügen, NHibernate nicht item
(wie es ohne Projektion würde) nicht auswählen, sondern nur die rowcount()
während ich wirklich brauche beides. Auch kann ich nicht item
als Ganzes projizieren, nur seine Eigenschaften und ich möchte wirklich nicht alle von ihnen auflisten.
Ich hoffe, jemand hat eine Lösung für dieses Problem. Danke trotzdem.
Mit CreateMultiCriteria in zwei separaten SQL-Abfragen führen würde generiert werden. Obwohl sie in einem einzigen Stapel ausgeführt werden, wäre sie dennoch nicht so effizient wie die Ausführung einer einzelnen Abfrage. Ich möchte 'SELECT *, COUNT (*) OVER() als rowcount FROM Items', nicht 'SELECT * FROM Items; SELECT COUNT (*) AS rowcount FROM Items 'wie das CreateMultiCriteria-Szenario würde mich bekommen. –