nhibernate пейджинг с отдельными критериями - PullRequest
1 голос
/ 08 февраля 2011

Я работаю над приложением, в котором я хотел бы реализовать пейджинг. У меня есть следующий класс, который реализует отдельные критерии -

public class PagedData : DetachedCriteria
    {
        public PagedData(int pageIndex, int pageSize) : base(typeof(mytype))
        {

            AddOrder(Order.Asc("myId"));

            var subquery = DetachedCriteria.For(typeof(mytype2))
                .SetProjection(Projections.Property("mytype.myId"));

            Add(Subqueries.PropertyIn("myId", subquery));

            SetFirstResult((pageIndex - 1) * pageSize);
            SetMaxResults(pageSize);   
        }
    }

Это работает нормально - возвращает именно те данные, которые я пытаюсь получить. Проблема, с которой я сталкиваюсь, заключается в получении общего количества строк для навигации по моей странице. так как я использую setfirstresults и setmaxresults в моих независимых критериях, количество строк всегда ограничивается входящей переменной pageSize.

У меня такой вопрос: как я могу получить общее количество строк? Должен ли я просто создать еще один отдельный критерий для расчета количества строк? Если это так, это добавит туда и обратно в БД? Было бы лучше, если бы я не использовал отдельные критерии и использовал прямой критерий запроса, в котором я мог бы использовать фьючерсы? Или я могу каким-то образом использовать фьючерсы с тем, что я сейчас делаю.

Пожалуйста, дайте мне знать, если потребуется какая-либо дополнительная информация.

Спасибо

Ответы [ 4 ]

3 голосов
/ 08 февраля 2011

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

    // In order to be able to determine the NumberOfItems in a efficient manner,
    // we'll clone the Criteria that has been given, and use a Projection so that
    // NHibernate will issue a SELECT COUNT(*) against the ICriteria.
    ICriteria countQuery = 
        CriteriaTransformer.TransformToRowCount (_criteria);

    NumberOfItems = countQuery.UniqueResult<int> ();

Где NumberOfItems - это свойство (с частным установщиком) внутри моего класса * PagedCriteriaResults. Класс PagedCriteriaResults принимает экземпляр ICriteria в своем конструкторе.

2 голосов
/ 08 февраля 2011

вы можете создать второй DetachedCriteria для подсчета строк с помощью встроенного CriteriaTransformer

DetachedCriteria countSubquery = NHibernate.CriteriaTransformer.TransformToRowCount(subquery)

это, конечно, приведет к повторному вызову БД

1 голос
/ 08 февраля 2011
0 голосов
/ 03 января 2014

Опираясь на два ответа выше, я создал этот метод для постраничного поиска, используя отдельные критерии.По сути, я просто беру обычные отдельные критерии и после того, как я создал реальный ICriteria из сессии, я преобразую его в критерий количества строк, а затем использую Future для обоих.Прекрасно работает!

public PagedResult<T> SearchPaged<T>(PagedQuery query)
    {
        try
        {
            //the PagedQuery object is just a holder for a detached criteria and the paging variables
            ICriteria crit = query.Query.GetExecutableCriteria(_session);
            crit.SetMaxResults(query.PageSize);
            crit.SetFirstResult(query.PageSize * (query.Page - 1));

            var data = crit.Future<T>();

            ICriteria countQuery = CriteriaTransformer.TransformToRowCount(crit);

            var rowcount = countQuery.FutureValue<Int32>();

            IList<T> list = new List<T>();
            foreach (T t in data)
            {
                list.Add(t);
            }

            PagedResult<T> res = new PagedResult<T>();
            res.Page = query.Page;
            res.PageSize = query.PageSize;
            res.TotalRowCount = rowcount.Value;
            res.Result = list;
            return res;
        }
        catch (Exception ex)
        {
            _log.Error("error", ex);
            throw ex;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...