2010-09-30 55 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