NHibernate使用ICriteria分頁並返回資料庫記錄總條數

hongfei008發表於2014-01-18

最近在使用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:在部落格園潛水很久了,第一次寫東西,很多東西不會表達,但是還是希望拿出些東西跟大家一起交流。各位大大輕拍!

相關文章