nhibernate 2.0高效数据分页DataList控件和ObjectDataSource

我如何使用nHibernate 2 ObjectDataSource在一次调用中完成Scott的工作

http://weblogs.asp.net/scottgu/archive/2006/01/07/434787.aspx

下面是我的数据访问方法

public IList GetListOfUser(int rows, int pageIndex) { IList userList = null; using (ITransaction tx = _session.BeginTransaction()) { try { userList = _session.CreateQuery("Select u from User u where u.DateSubmitted is not null") .SetFirstResult(rows * (pageIndex - 1) + 1) .SetMaxResults(rows) .List(); tx.Commit(); } catch (NHibernate.HibernateException ex) { tx.Rollback(); AppUtil.LogHelper.WriteLog(LogLevel.ERROR, ex.ToString()); throw; } } return userList; } 

实际上,如果您正在使用ICriteria查询,则可以使用此帮助程序方法将结果页和总记录数计算到服务器中:

  protected IList 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 records = new List(); if (untypedRecords != null) { foreach (T obj in untypedRecords) { records.Add(obj); } } else { records = new List(); } totalCount = Convert.ToInt64(((IList)multiResult[1])[0]); return records; } 

它将原始条件克隆两次:一个返回页面记录的条件和一个总记录计数的条件。 它还使用IMultiCriteria在一次往返中执行两个数据库调用。

有它工作,但两个电话

我将itemCount添加到ref:

 itemCount = (Int64)_session.CreateQuery("select count(UserId) from User") .UniqueResult();