单个调用中的多个结果

问题描述:

当分页数据时,我不仅要返回10个结果,而且还希望获得所有页面中的项目总数。单个调用中的多个结果

如何在一次调用中获得总计数和页面结果?

我的分页方法是:

公共IList的GetByCategoryId(INT的categoryId,诠释FIRSTRESULT,INT的maxResults) {

 IList<Article> articles = Session.CreateQuery(
      "select a from Article as a join a.Categories c where c.ID = :ID") 
      .SetInt32("ID", categoryId) 
      .SetFirstResult(firstResult) 
      .SetMaxResults(maxResults) 
      .List<Article>(); 



     return articles; 
    } 
+0

我试过去也有类似的东西,但最终打了2个电话。检查总数的呼叫相对'轻',所以对我来说很好。 – 2009-12-22 15:29:42

的事实是,你让两个电话。但是在大多数数据库中count(*)调用非常非常便宜,而当您在主调用之后执行调用时,查询缓存有时会提供帮助。

你的计数器调用通常会有点不同,它实际上并不需要使用内部连接才有意义。还有一些小小的性能调整,但大多数时候你不需要它们。

我相信你其实可以做你所要求的。您可以在代码中一次性检索计数和页面,但不能在一条SQL语句中进行检索。实际上,两个查询被发送到数据库,但是在一次往返中,结果被检索为2个元素的数组。其中一个元素是总数作为一个整数,第二个是您检索到的实体的IList。

有两种方法做到这一点:

  • MultyQuery
  • 多目标

下面是从下面的链接抽取的样本:

IList results = s.CreateMultiQuery() 
     .Add("from Item i where i.Id > :id") 
     .Add("select count(*) from Item i where i.Id > :id") 
     .SetInt32("id", 50) 
     .List(); 

IList items = (IList)results[0]; 
long count = (long)((IList)results[1])[0]; 

下面是详细信息关于你如何做到这一点。它非常简单。

http://ayende.com/Blog/archive/2006/12/05/NHibernateMutliQuerySupport.aspx http://ayende.com/Blog/archive/2007/05/20/NHibernate-Multi-Criteria.aspx

如果你读你上面的两篇文章会看到有使用这种方法,增加了价值,做寻呼与MultiQuery用户多了反正更加透明和清晰的方式反对的性能增益传统的方式。

请注意,NHibernate的最新版本支持期货的想法,所以你可以做。

var items = s.CreateQuery("from Item i where i.Id > :id") 
     .SetInt32("id", 50) 
     .Future<Item>(); 

var count = s.CreateQuery("select count(*) from Item i where i.Id > :id") 
     .SetInt32("id", 50) 
     .FutureValue<long>(); 

这是一个更自然的语法,它仍然会导致一个数据库查询。 你可以在这里阅读更多关于它的信息: http://ayende.com/Blog/archive/2009/04/27/nhibernate-futures.aspx