5

Ayende beschreibt eine wirklich gute Möglichkeit, Seitenanzahl zu erhalten, und eine bestimmte Seite von Daten in einer einzigen Abfrage hier:NHibernate: Wie die Root-Entität in einer Projektion wählen

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

Seine Methode sieht aus wie :

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

Das einzige Problem ist dieses Beispiel in HQL ist, und ich brauche die gleiche Sache in einer ICriteria Abfrage zu tun. Zur Ermittlung des Äquivalents mit ICriteria zu erreichen, brauche ich, wie etwas zu tun ist:

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

Das Problem ist, es gibt nicht so etwas wie Projections.RootEntity(). Gibt es eine Möglichkeit, das Stammelement als eine der Projektionen in einer Projektionsliste auszuwählen?

Ja, ich weiß, ich könnte CriteriaTransform.TransformToRowCount() verwenden, aber das würde erfordern, die Abfrage zweimal auszuführen - einmal für die Ergebnisse und einmal für die Zeilenanzahl. Die Verwendung von Futures kann ein wenig helfen, indem es auf einen Umlauf reduziert wird, aber es führt die Abfrage immer noch zweimal auf dem SQL Server aus. Für intensive Anfragen ist dies nicht akzeptabel. Ich möchte den Overhead vermeiden und die Zeilenanzahl und die Ergebnisse in derselben Abfrage zurückgeben.

Die grundlegende Frage ist: Verwenden Sie ICriteria, gibt es eine Möglichkeit, die Stamm-Entity UND eine andere Projektion zur gleichen Zeit auszuwählen?

EDIT: einige relevante Links:

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

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

Antwort