2010-09-30 56 views
1

我非常需要幫助。Nhibernate Criteria進行動態查詢並獲得行計數

我正在使用標準動態查詢:

ICriteria query = session.CreateCriteria(typeof(Employee)); 

if (searchOptions.FirstName != null) 
{ 
    query.Add(Expression.Eq("FirstName", searchOptions.FirstName)); 
} 

if (!searchOptions.LastName != null) 
{ 
    query.Add(Expression.Eq("LastName", searchOptions.LastName)); 
} 

if (searchOptions.PhoneNumber != null) 
{ 
    query.CreateCriteria("PhoneNumbers") 
    .Add(Expression.Like("Number", searchOptions.PhoneNumber + "%")); 
} 

這個我需要有兩個總行數和分頁後。

對於分頁:

query.SetFirstResult(0).SetMaxResults(8); 

的行數:

query.SetProjection(Projections.RowCountInt64()); 

我怎樣才能既在一個查詢或者通過使用多標準或別的東西執行。

請幫忙!

回答

5

你可以在nhibernate 2.0 Efficient Data Paging DataList Control and ObjectDataSource看到我的答案。再次

代碼:

protected IList<T> GetByCriteria(
     ICriteria criteria, 
     int pageIndex, 
     int pageSize, 
     out long totalCount) 
    { 
     ICriteria recordsCriteria = CriteriaTransformer.Clone(criteria); 

     // Paging. 
     recordsCriteria.SetFirstResult(pageIndex * pageSize); 
     recordsCriteria.SetMaxResults(pageSize); 

     // Count criteria. 
     ICriteria countCriteria = CriteriaTransformer.TransformToRowCount(criteria); 

     // Perform multi criteria to get both results and count in one trip to the database. 
     IMultiCriteria multiCriteria = Session.CreateMultiCriteria(); 
     multiCriteria.Add(recordsCriteria); 
     multiCriteria.Add(countCriteria); 
     IList multiResult = multiCriteria.List(); 

     IList untypedRecords = multiResult[0] as IList; 
     IList<T> records = new List<T>(); 
     if (untypedRecords != null) 
     { 
      foreach (T obj in untypedRecords) 
      { 
       records.Add(obj); 
      } 
     } 
     else 
     { 
      records = new List<T>(); 
     } 

     totalCount = Convert.ToInt64(((IList)multiResult[1])[0]); 

     return records; 
    } 

其複製原來的標準兩次:一個是返回頁面的記錄和記錄總數一個標準的標準。它還使用IMultiCriteria在一次往返中執行兩個數據庫調用。

+0

你測試過這個性能嗎?它是否真的改善了它,並通過多少? – 2011-01-19 16:41:44

+0

我會回答我自己的問題。簡而言之,根據ayende的說法,這個數字大約是25%-30%。請參閱http://ayende.com/Blog/archive/2009/04/27/nhibernate-futures.aspx – 2011-01-19 17:56:23