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();