2016-11-11 3 views
1

Я вычислил кучу строк сам вручную, включая некоторые дополнительных данных, которых нет в моей базе данных. Для эффективности я вычислял только строки, которые находятся на текущей странице, на основе номера страницы и размера страницы.Как вручную заполнить PagedList из SUBSET строк на текущей странице

Я попытался засунуть это в PagedList, но это требует целого набора данных, а не только подмножества Я хочу, чтобы отобразить.

Просьба предоставить полный пример пользовательского объекта выгружаемого списка, который содержит только текущую страницу. Может быть, реализовать IPagedList напрямую ??

Другая проблема заключается в том, что я не могу узнать общее количество строк до того, как вычислить весь список. Это действительно необходимо?

+0

Это зависит от реализации 'IPagedList'. С моей точки зрения, «PagedList» - это всего лишь модель (или модель представления), как и другие модели. Вы можете инициализировать его, установив его свойства. –

+0

Также всегда выгружаемый список содержит только страницу, которую вы хотите показать. Он никогда не будет содержать все данные. –

+0

В итоге мне пришлось вычислить общее количество строк, чтобы заставить его работать. – Emmanuel

ответ

1

Ответ зависит от реализации IPagedList. PagedList - это всего лишь модель (или модель обзора), как и другие модели. Вы можете инициализировать его, установив его свойства. Также всегда выгружаемый список содержит только страницу, которую вы хотите показать. Он никогда не будет содержать все данные.

Примечание: Реализации в этом ответе - просто держать вещи простыми. Чтобы увидеть популярную версию выгружаемого списка, вы можете взглянуть на X.PagedList. Он содержит некоторые реализации как для автоматического, так и для ручного подкачки, а также для некоторых полезных помощников для ASP.NET MVC.

Пример

Предположим, что у нас есть такая реализация IPagedList:

public interface IPagedList<T> : IList<T> 
{ 
    int PageCount { get; set; } 
    int PageSize { get; set; } 
    int PageNumber { get; set; } 
    int TotalItemsCount { get; set; } 
} 

public class PagedList<T> : List<T>, IPagedList<T> 
    where T : class 
{ 
    public int PageCount { get; set; } 
    public int PageSize { get; set; } 
    public int PageNumber { get; set; } 
    public int TotalItemsCount { get; set; } 
} 

Затем вы можете создать экземпляр экземпляр PagedList<T> как любые другие обычные классы, присвоив его свойства.

Также вы можете создать некоторые методы расширения, которые помогут вам извлечь данные конкретной страницы в IQueryable<T> или IEnumerable<T>:

using System; 
using System.Collections.Generic; 
using System.Linq; 

public static class PagingExtensions 
{ 
    public static PagedList<T> ToPagedList<T>(this IEnumerable<T> source, 
     int pageNumber, int pageSize) where T : class 
    { return source.AsQueryable().ToPagedList(pageNumber, pageSize); } 
    public static PagedList<T> ToPagedList<T>(this IQueryable<T> source, 
     int pageNumber, int pageSize) where T : class 
    { return CreatePagesList<T>(source, pageNumber, pageSize); } 
    private static PagedList<T> CreatePagesList<T>(IQueryable<T> source, 
     int pageNumber, int pageSize) where T : class 
    { 
     var items = new List<T>(); 
     var pageIndex = pageNumber - 1; 
     if (source == null) source = new List<T>().AsQueryable(); 
     var totalItemsCount = source.Count(); 
     if (pageNumber < 1) 
      throw new ArgumentOutOfRangeException("pageNumber cannot be less than 1."); 
     if (pageSize < 1) 
      throw new ArgumentOutOfRangeException("pageSize cannot be less than 1."); 
     var pageCount = 0; 
     if (totalItemsCount > 0) 
      pageCount = (int)Math.Ceiling(totalItemsCount/(double)pageSize); 
     if (pageIndex >= pageCount) 
      pageIndex = Math.Max(pageCount - 1, 0); 
     if (pageIndex < pageCount && totalItemsCount > 0) 
      items.AddRange(source.Skip((pageIndex) * pageSize).Take(pageSize).ToList()); 
     var pagedList= new PagedList<T>() 
     { 
      PageNumber = pageNumber, PageSize = pageSize, 
      PageCount = pageCount, TotalItemsCount = totalItemsCount 
     }; 
     pagedList.AddRange(items); 
     return pagedList; 
    } 
} 
+0

Как ваш ответ, так и ответ @ Kaspars Ozols делают то, что мне нужно. Я поеду с тобой, потому что ты первый. – Emmanuel

+0

Спасибо за обратную связь :), как упоминалось в ответах в этом ответе, просто нужно держать вещи простыми. Чтобы увидеть популярную реализацию выгружаемого списка, вы можете взглянуть на [X.PagedList] (https://github.com/kpi-ua/X.PagedList). –

1

Для решения этой задачи я предлагаю использовать существующие NuGet таких как: https://www.nuget.org/packages/PagedList

В этой конкретной библиотеке вы можете сгенерировать s ubset элементов, которые вы хотите отобразить, и создать StaticPagedList из этого списка.

Вот пример:

public class UserController : Controller 
{ 
    public object Index(int? page) 
    { 
     var pageIndex = (page ?? 1) - 1; //MembershipProvider expects a 0 for the first page 
     var pageSize = 10; 
     int totalUserCount; // will be set by call to GetAllUsers due to _out_ paramter :-| 

     var users = Membership.GetAllUsers(pageIndex, pageSize, out totalUserCount); 
     var usersAsIPagedList = new StaticPagedList<MembershipUser>(users, pageIndex + 1, pageSize, totalUserCount); 

     ViewBag.OnePageOfUsers = usersAsIPagedList; 
     return View(); 
    } 
} 

См исходный код & другие примеры здесь: https://github.com/TroyGoode/PagedList

+1

Библиотека поддерживается в [X.PagedList] (https://github.com/kpi-ua/X.PagedList), как я также упомянул в [ответе] (http://stackoverflow.com/a/40558159/3110834). –

+0

@RezaAghaei, вы правы. Спасибо, что указали это, я некоторое время использовал PagedList от TroyGoode и некоторое время не посещал сайт проекта, поэтому информация о нем не поддерживается. –

+0

И ваш ответ, и ответ @ RezaAghaei делают то, что мне нужно. Я могу голосовать только за один выигрышный ответ ... Я пойду с ним, потому что он был первым. – Emmanuel

Смежные вопросы