2011-03-02 14 views
5

Usando un resultado paginado de alguna consulta, necesito obtener de qué página es un punto. El objeto es devolver los datos colocados en la página correcta cuando empuja el punto fuera del alcance que abre el paginado resultado en esta página.
Si el resultado paginado se puede obtener como este ejemplo, ¿cómo puedo obtener un elemento de la página que viene?MongoDB C#: Pregunta sobre la paginación

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

Gracias por su ayuda.

Respuesta

9

El número de página debe (y el posible orden de clasificación y dirección) proceder del lado del cliente. Entonces cliente haga clic en la página y luego ...

Personalmente estoy usando algún tipo de filtro que contiene todas las propiedades que necesita.

Al usar ese filtro solo necesita especificar la página que necesita mostrar en la cuadrícula y la cantidad de elementos que necesita por página.

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 

también le puede inferit de BasicFilter y añadir propiedades que necesita para quering, clasificación. Aquí código del filtro (espero que sea útil para usted):

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

El objeto es gestionar de artículos no Scoope el método de paginación. Tiene un elemento aislado en alguna parte, agrega un evento clik para abrir en una vista paginada en otra página, pero ¿cuál es el número de página de este punto que necesita abrir ?. Estoy buscando abrir en la página correcta seleccionada. – user325558

+0

Usar solo el _id del ítem del lado del cliente (sin dirección o orden administrado) – user325558