【问题标题】:MongoDB c# : Question about paginationMongoDB c#:关于分页的问题
【发布时间】:2011-07-07 06:53:46
【问题描述】:

使用某些查询的分页结果,我需要从哪个页面获取点。当您将点推出范围时,该对象将返回位于正确页面上的数据,在此页面打开分页结果。 如果可以像这个示例一样获得分页结果,我如何从即将到来的页面中获取项目?

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

感谢您的帮助。

【问题讨论】:

    标签: c# pagination mongodb mongodb-.net-driver


    【解决方案1】:

    页码应该(以及可能的排序顺序和方向)来自客户端。所以客户端点击某个页面然后...

    我个人使用某种过滤器,其中包含您需要的所有属性。

    使用该过滤器,您只需指定需要在网格中显示的页面以及每页需要多少项目。

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

    【讨论】:

    • 对象是管理超出范围的项目而不是分页方法。您在某处有一个孤立的项目,您添加一个单击事件以在另一个页面的分页视图中打开,但是该点需要打开的页码是多少?我正在搜索在选择的正确页面上打开。
    • 仅使用来自客户端的项目的_id(不管理方向或订单)
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多