多个结果在一次通话中

时间:2009-12-22 15:22:10

标签: nhibernate

在分页数据时,我不仅想要返回10个结果,而且还希望得到所有页面中的项目总数。

如何在一次通话中获得页面的总计数和结果?

我的分页方法是:

public IList GetByCategoryId(int categoryId,int 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;
    }

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我相信你实际上可以做你所要求的。您可以在代码中一次性查看计数和页面,但不能在一个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和MultiCriteria进行分页,而不是传统方式。

答案 2 :(得分:1)

请注意,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