Критерии Nhibernate делают динамический запрос и получают количество строк - PullRequest
1 голос
/ 30 сентября 2010

Мне очень нужна помощь.

Я делаю динамический запрос, используя критерии:

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

Как выполнить оба в одном запросе, используя MultiCriteria или что-то еще.

Пожалуйста, помогите!

1 Ответ

5 голосов
/ 30 сентября 2010

Мой ответ вы можете увидеть в nhibernate 2.0 Эффективный пейджинг данных Control DataList Control и 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 для выполнения обоих вызовов базы данных за один прием.

...