Ayende は、1 回のクエリでページ数と特定のページのデータを取得するための非常に優れた方法について説明しています。
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();
問題は、Projections.RootEntity() のようなものがないことです。投影リストの投影の 1 つとしてルート エンティティを選択する方法はありますか?
はい、私は CriteriaTransform.TransformToRowCount() を使用できることを知っていますが、それにはクエリを 2 回実行する必要があります。1 回は結果用、もう 1 回は行数用です。Futures を使用すると、ラウンドトリップが 1 回に減るので少しは役立つかもしれませんが、それでも SQL Server でクエリを 2 回実行しています。集中的なクエリの場合、これは受け入れられません。オーバーヘッドを回避し、行数と結果を同じクエリで返したいと考えています。
基本的な質問は次のとおりです。ICriteria を使用して、ルート エンティティと他のプロジェクションを同時に選択する方法はありますか?
編集:いくつかの関連リンク:
https://nhibernate.jira.com/browse/NH-1372?jql=text%20~%20%22entity%20projection%22