最近在使用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集合給前端使用(待實現)
不知道大家還有沒有更好的實現方法?
ps:在部落格園潛水很久了,第一次寫東西,很多東西不會表達,但是還是希望拿出些東西跟大家一起交流。各位大大輕拍!