【问题标题】:nhibernate 2.0 Efficient Data Paging DataList Control and ObjectDataSourcenhibernate 2.0 高效数据分页 DataList 控件和 ObjectDataSource
【发布时间】:2010-08-27 08:50:46
【问题描述】:

我将如何使用 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;
        }

【问题讨论】:

  • 澄清一下,您是否有兴趣在使用 NHibernate 的单个查询中获取分页列表以及总项目数?
  • 嗨,是的,我一直在研究这个。我怎么能算出来呢? Select Count(u.UserId) as userCount from User u where u.DateSubmitted is not null 所以我可以得到一个 Int32 值,

标签: c# asp.net nhibernate objectdatasource


【解决方案1】:

实际上,如果您使用 ICriteria 查询,您可以使用此帮助方法获取结果页面和一次往返服务器的总记录数:

    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 在一次往返中执行两个数据库调用。

【讨论】:

    【解决方案2】:

    让它工作,但是两个电话

    我将 itemCount 添加到 ref:

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

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多