NHibernate使用ICriteria分页并返回数据库记录总条数
2015-05-10 13:55
543 查看
转自:http://www.cnblogs.com/hongfei008/p/3524717.html
最近在使用NHibernate,发现进行分页查询无法得到数据库记录的总条数,在网上找了很久没找到具体的实现方法,找到的资料都说得不是很清楚,研究了很久终于写出了这样一个方法。
NHibernate下分页要使用Icriteria约束查询条件,但是返回的只有当前页的记录数,无法返回数据库总记录条数,这样在使用的时候就算不出总页数。自定义一个分页响应对象PageResponse用于返回记录总条数和分页查询结果集。
/// <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;
}
}
使用这种分页有两个问题
1.使用两个Icriteria来查询两次,不知道性能怎么样(待测试)
2.返回的结果集包含数据库的所有字段,不能直接在前端使用,需要把数据库查出来的结果集转换(DTO)为一个ViewModel集合给前端使用(待实现)
不知道大家还有没有更好的实现方法?
最近在使用NHibernate,发现进行分页查询无法得到数据库记录的总条数,在网上找了很久没找到具体的实现方法,找到的资料都说得不是很清楚,研究了很久终于写出了这样一个方法。
NHibernate下分页要使用Icriteria约束查询条件,但是返回的只有当前页的记录数,无法返回数据库总记录条数,这样在使用的时候就算不出总页数。自定义一个分页响应对象PageResponse用于返回记录总条数和分页查询结果集。
/// <summary> /// 分页响应对象 /// </summary> /// <typeparam name="T"></typeparam> public class PageResponse<T> { public int TotalCount { get; set; } public IList<T> ResultList { get; set; } }参考网上的方法,先创建一个ICriteria用于查询数据库记录总条数,再clone一个用于分页查询,返回我自己定义的PageResponse对象,包含记录总条数和分页查询结果集。获得数据库记录总数之后要用UniqueResult()将SetProjection()所附加的条件去掉,注意一定要clone一个Icriteria来分页,否则只用一个Icriteria来完成两次操作会报错。
/// <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;
}
}
使用这种分页有两个问题
1.使用两个Icriteria来查询两次,不知道性能怎么样(待测试)
2.返回的结果集包含数据库的所有字段,不能直接在前端使用,需要把数据库查出来的结果集转换(DTO)为一个ViewModel集合给前端使用(待实现)
不知道大家还有没有更好的实现方法?
相关文章推荐
- NHibernate使用ICriteria分页并返回数据库记录总条数
- NHibernate使用Criteria分页显示并返回记录总数 【转】
- NHibernate使用Criteria分页显示并返回记录总数 【转】
- 关于-NHibernate使用Criteria分页显示并返回记录总数
- 关于-NHibernate使用Criteria分页显示并返回记录总数
- (转)NHibernate使用Criteria分页显示并返回记录总数
- NHibernate使用Criteria分页显示并返回记录总数
- NHibernate使用Criteria分页显示并返回记录总数
- 使用SQL语句获取数据库中随机N个记录
- 用于查询当前数据库中所有表格的记录条数的脚本
- 通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录
- :[百万级]通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录
- 使用Session记录页面地址和实现页面返回功能
- 通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录
- NHibernate1.02使用MsAccess2000Dialect 提供对 Access 数据库的支持
- 今天在使用C#的ASP.NET给Access的数据库中添加新记录发现的问题
- Dblog使用记录之数据库字符
- 使用SQL语句获取数据库中随机N个记录
- 使用seek在数据库中查找记录
- 数据库返回记录需要自由移动