首页 > 其他 > 详细

NHibernate使用ICriteria分页并返回总记录条数

时间:2014-01-18 09:02:13      阅读:371      评论:0      收藏:0      [点我收藏+]

   最近在使用NHibernate,发现进行分页查询无法得到数据库记录的总条数,在网上找了很久没找到具体的实现方法,找到的资料都说得不是很清楚,研究了很久终于写出了这样一个方法。  

   NHibernate下分页要使用Icriteria约束查询条件,但是返回的只有当前页的记录数,无法返回数据库总记录条数,这样在使用的时候就算不出总页数。自定义一个分页响应对象PageResponse用于返回记录总条数和分页查询结果集。

bubuko.com,布布扣
    /// <summary>
    /// 分页响应对象
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class PageResponse<T>
    {
        public int TotalCount { get; set; }
        public IList<T> ResultList { get; set; }
    }
bubuko.com,布布扣

        参考网上的方法,先创建一个ICriteria用于查询数据库记录总条数,再clone一个用于分页查询,返回我自己定义的PageResponse对象,包含记录总条数和分页查询结果集。获得数据库记录总数之后要用UniqueResult()SetProjection()所附加的条件去掉,注意一定要clone一个Icriteria来分页,否则只用一个Icriteria来完成两次操作会报错。

bubuko.com,布布扣
        /// <summary>
        /// 分页查询
        /// </summary>
        /// <param name="pageSize">每页显示记录条数</param>
        /// <param name="pageNumber">页码</param>
        /// <returns></returns>
        public PageResponse<RequestMessage> GetRequestMessageList(int pageNumber, int pageSize)
        {
            using (ISession session = sessionFactory.OpenSession())
            {
                ICriteria criteria = session.CreateCriteria(typeof(RequestMessage));
                ICriteria pageCriteria = CriteriaTransformer.Clone(criteria);
                PageResponse<RequestMessage> requestMessage = new PageResponse<RequestMessage>();
                requestMessage.TotalCount =Convert.ToInt32(criteria.SetProjection(Projections.RowCount()).UniqueResult());
                requestMessage.ResultList = pageCriteria
                                                .SetFirstResult(pageSize * (pageNumber < 1 ? 0 : pageNumber - 1))
                                                .SetMaxResults(pageSize)
                                                .List<RequestMessage>();

                session.Flush();
                return requestMessage;
            }
        }
bubuko.com,布布扣

 

使用这种分页有两个问题
1.使用两个Icriteria来查询两次,不知道性能怎么样(待测试)
2.返回的结果集包含数据库的所有字段,不能直接在前端使用,需要把数据库查出来的结果集转换(DTO)为一个ViewModel集合给前端使用(待实现)
 
不知道大家还有没有更好的实现方法?
 
ps:在博客园潜水很久了,第一次写东西,很多东西不会表达,但是还是希望拿出些东西跟大家一起交流。各位大大轻拍!

NHibernate使用ICriteria分页并返回总记录条数

原文:http://www.cnblogs.com/hongfei008/p/3524717.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!