5

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

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

4

1 回答 1

1

我实现了一个 RootEntityProjection。您可以尝试代码,您可以在以下位置找到该代码:http ://weblogs.asp.net/ricardoperes/archive/2014/03/06/custom-nhibernate-criteria-projections.aspx 。让我知道它是否有帮助。

于 2014-03-06T20:46:14.877 回答