最近在使用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; } }
新聞熱點
疑難解答