MongoDB c #: вопрос о нумерации страниц - PullRequest
5 голосов
/ 02 марта 2011

Используя постраничный результат некоторого запроса, мне нужно получить, с какой страницы является точка. Объект возвращает данные, расположенные на правой странице, когда вы выдвигаете точку из области, открывая постраничный результат на этой странице.1001 * Если постраничный результат может быть получен, как в этом примере, как я могу получить из элемента, с какой страницы идет?

paging
.skip(PAGE_SIZE * (PAGE_NUMBER - 1)).limit(PAGE_SIZE)

    public List<BsonItem> GetData(QueryComplete query, int take, int skip, SortByBuilder sort)
        {
            var cursor = Db.Data.FindAs<BsonItem>(query);

            if (skip > 0)
                cursor.SetSkip(skip);
            if (take > 0)
                cursor.SetLimit(take);
            if (sort != null )
                cursor.SetSortOrder(sort);
            return cursor.ToList();
        }

Спасибо за вашу помощь.

1 Ответ

9 голосов
/ 02 марта 2011

Номер страницы должен (и возможный порядок и направление сортировки) поступать со стороны клиента. Так что клиент нажимает на какую-то страницу и чем ..

Лично я использую какой-то фильтр, который содержит все нужные вам свойства.

Используя этот фильтр, вам просто нужно указать страницу, которую вы хотите отобразить в сетке, и сколько элементов вам нужно на страницу.

var pageNumber = 1;// current page should come from the client
var filter = new BaseFilter(){CurrentPage = pageNumber, ItemsPerPage = 30};
var items = GetItemsByFilter(filter, Query.LTE("SomeDate",DateTime.Now)),
                                     SortBy.Ascending("SortField"));
//For basic paging you only following three properties
var totalCount = filter.TotalCount; // here will be total items count
var pagesCount = filter.TotalPagesCount; // here will be total pages count
// pageNumber  = current page

Также вы можете выводить из BasicFilter и добавлять любые свойства, которые вам нужны для запроса, сортировки. Вот фильтр кода (надеюсь, он вам пригодится):

 public List<Item> GetItemsByFilter(BaseFilter filter, 
                   QueryComplete query, SortByBuilder sort)
 {
   var resultItems = new List<Item>();
   var cursor = Db.Data.FindAs<BsonItem>(query);

   cursor.SetSortOrder(sort);
   if (filter.IsNeedPaging)
   {
     cursor.SetSkip(filter.Skip).SetLimit(filter.Take);
     filter.TotalCount = cursor.Count();
   }

   resultItems.AddRange(cursor);

   return resultItems;
 }


 public class BaseFilter
 {
   private int _itemsPerPage = 10;
   private int _skip = 0;
   private int _currentPage = 1;

   public BaseFilter()
   {
     IsNeedPaging = true;
   }

   public int Skip
   {
     get
     {
       if (_skip == 0)
         _skip = (CurrentPage - 1) * _itemsPerPage;
       return _skip;
     }
     set
     {
       _skip = value;
     }
   }

   public int Take
   {
     get
      {
         return _itemsPerPage;
      }
     set
      {
        _itemsPerPage = value;
      }
    }

    public bool IsNeedPaging { get; set; }

    public int TotalCount { get; set; }

    public int CurrentPage
    {
      get
        {
           return _currentPage;
        }
      set
        {
          _currentPage = value;
        }
    }

    public int ItemsPerPage
    {
      get
        {
          return _itemsPerPage;
        }
      set
        {
          _itemsPerPage = value;
        }
     }

     public int TotalPagesCount
     {
       get
         {
           return TotalCount / ItemsPerPage + 
                            ((TotalCount % ItemsPerPage > 0) ? 1 : 0);
         }
     }
   }
...