Ayende 描述了一种非常好的获取页数的方法,以及单个查询中的特定数据页:
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() 这样的东西。有没有办法选择根实体作为投影列表中的投影之一?
是的,我知道我可以只使用 CriteriaTransform.TransformToRowCount() 但这需要执行两次查询 - 一次用于结果,一次用于行数。使用 Futures 可能会有所帮助,将其减少到一次往返,但它仍在 SQL Server 上执行两次查询。对于密集查询,这是不可接受的。我想避免开销,并在同一个查询中返回行数和结果。
基本问题是:使用 ICriteria,有没有办法同时选择根实体和其他投影?
编辑:一些相关链接:
https://nhibernate.jira.com/browse/NH-1372?jql=text%20~%20%22entity%20projection%22