nhibernate 2.0 Эффективное разбиение данных на страницы DataList Control и ObjectDataSource

Как мне сделать то, что Скотт сделал за один вызов, используя nHibernate 2 ObjectDataSource

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;
        }

person kemical    schedule 27.08.2010    source источник
comment
Просто для ясности: вы заинтересованы в получении постраничного списка вместе с общим количеством элементов в одном запросе с использованием NHibernate?   -  person DanP    schedule 27.08.2010
comment
Привет Да, я изучал это. Как бы мне тоже подсчитать? Выберите Count(u.UserId) как userCount от пользователя u, где u.DateSubmitted не равно нулю. Поэтому я мог бы получить значение Int32,   -  person kemical    schedule 28.08.2010


Ответы (2)


На самом деле, вы можете получить страницу результатов И общее количество записей за одно обращение к серверу, используя этот вспомогательный метод, если вы используете запросы 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 для выполнения обоих вызовов базы данных за один цикл.

person Andreas Paulsson    schedule 06.09.2010

Работает, но два звонка

Я добавил itemCount в ссылку:



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

person kemical    schedule 31.08.2010