Nhibernate Icreteria 分页查询

1、创建查询条件,条件为一个ICreterion的列表

        ///
        /// 创建Criteria(不含order,因为获取总数的时候,为了性能考虑,不加order)
        ///
        /// 类型
        /// ICriterion列表
        ///
        public ICriteria CreateCriteria(Type t, List list)
        {
            ICriteria criteria = Session.CreateCriteria(t);

            if (list != null && list.Count > 0)
            {
                foreach (ICriterion c in list)
                {
                    criteria.Add(c);
                }
            }

            return criteria;
        }

2、分页查询

        ///
        ///获取排序的pageInfo
        ///
        /// 类型
        /// ICriterion列表
        /// 升序?true:false
        /// 排序字段
        ///
        public PageInfo getOrderdPagedListByCriteria(PageInfo pageInfo,Type t, List list, bool isAsc, string orderBy)
        {
           ICriteria c= CreateCriteria(t, list);//拼接查询条件

           int startNum = pageInfo.CurrentPage * pageInfo.PageSize;

//创建一个同样的ICriteria对象,不然执行总数查询之后,ICriteria的条件依然还是总数查询,下边的结果查询会出错。

           ICriteria pageCriteria = CriteriaTransformer.Clone(c);

//执行结果查询,Projections对象会投影到一个新的查询,包含AVG、sum、count等等
           pageInfo.RowCount = int.Parse(pageCriteria.SetProjection(Projections.RowCount()).UniqueResult().ToString());

//执行完总数查询之后,就给之前的ICriteria对象创建排序规则

           if (isAsc)
               c.AddOrder(new Order(orderBy, true));
           else
               c.AddOrder(new Order(orderBy, false));

//创建完排序规则之后,执行数据查询
           pageInfo.Results = c.SetFirstResult(startNum).SetMaxResults(pageInfo.PageSize).List().ToList();

           return pageInfo;
        }

注:PageInfo是一个分页类

 ///
        /// 结果
        ///
        public List Results { get; set; }

        ///
        /// 当前页码
        ///
        public int CurrentPage { get; set; }

        ///
        /// 页总数(一共有多少页)
        ///
        public int PageCount
        {
            get
            {
                if (RowCount == 0)
                {
                    return 1;
                }
                else
                {
                    return (int)Math.Ceiling(RowCount / (double)PageSize);
                }
            }
            private set
            {
                this.PageCount = value;
            }
        }

        ///
        /// 总记录数
        ///
        public int RowCount { get; set; }

        ///
        /// 每页记录数
        ///
        private int pagesize;
        public int PageSize
        {
            get { return pagesize; }
            set { pagesize = value; }
        }

            
    }

原文地址:https://www.cnblogs.com/elim/p/4277310.html