最近開(kāi)始學(xué)習用NHibernate,在分頁(yè)顯示的時(shí)候遇到了麻煩,用Criteria返回分頁(yè)記錄的時(shí)候不知道該如何取得記錄的總數,用hibernate也有這個(gè)問(wèn)題,網(wǎng)上搜索了一下,發(fā)現提這個(gè)問(wèn)題的人也不少,但是解決的辦法卻幾乎差不多,基本上都說(shuō)用另一條select count(*) 或者用 select count(Id) 來(lái)查詢(xún)記錄總數,可是在要動(dòng)態(tài)傳入參數的時(shí)候構造 HQL查詢(xún)語(yǔ)句感覺(jué)很麻煩,有沒(méi)有什么更好的辦法呢?NHibernate的資料不多,最后只好在Nhibernate手冊中查找,發(fā)現其實(shí)在Criteria中可以通過(guò)調用SetProjection()來(lái)進(jìn)行count查詢(xún),我想知道這個(gè)的人應該很多,可是在分頁(yè)中該怎么具體應用估計可能就不多了吧,因為在找到的解決方法里面基本上就沒(méi)看見(jiàn),呵呵?,F在記錄下來(lái),以備以后參考。
/// <summary>
/// 返回文章列表
/// </summary>
/// <param name="userId">文章Id</param>
///<param name="categoryId">分類(lèi) Id</param>
/// <param name="sortFiled">排序字段</param>
/// <param name="direction">排序方向</param>
/// <param name="currentPageIndex">當前頁(yè)碼</param>
/// <param name="pageSize">每頁(yè)大小</param>
/// <param name="recordCount">返回記錄總數</param>
/// <returns>IList列表</returns>
public IList Getarticles(int userId,int categoryId, string sortFiled,bool direction, int currentPageIndex, int pageSize, out int recordCount)
{
ICriteria criteria=DataAccess.Criteria( typeof( MovieUrl ) )
.Add( Expression.Eq("UserId",userId ) )
.Add( Expression.Eq( "CategoryId", categoryId ));
//獲取記錄總數
recordCount = Convert.ToInt32(criteria.SetProjection( Projections.Count(MovieUrl.__ID ))
.UniqueResult( ));
criteria.SetProjection( null );
//設置排序
criteria.AddOrder( new Order( sortField, direction) )
//設置分頁(yè)
criteria.SetFirstResult( (currentPageIndex.Value-1) * pageSize.Value )
.SetMaxResults( pageSize.Value );
return criteria.List( );
}
上面代碼關(guān)鍵 criteria.SetProjection( null );這一句,這樣就可以不用手動(dòng)組裝返回記錄總數的HQL語(yǔ)句,在利用Criteria返回記錄總數后再利用同一個(gè)Criteria返回列表