分页IEnumerable数据集

时间:2010-03-03 22:09:06

标签: c# .net

IEnumberable(或更好的库)是否有内置的分页功能?我知道有Take<>(),但我发现自己反复实施基本计算来确定给定页面大小的页数。我意识到这是一个简单的实现,但这就是为什么我希望它已经在库中了,我只是错过了它。

通过分页,我指的是指向当前记录的指针,以及满足以下概念的东西。

.PageSize< - 获取/设置页面大小 。最后< - 最后一页 。当前< - 当前页面 .JumpTo(PAGENUMBER)

使用故障保险箱确保在页面大小或设置大小更改时最终到达正确的位置

1 个答案:

答案 0 :(得分:2)

您可以使用列表by Rob Conery周围的PagedList包装器。 Troy Goode还有一个扩展版本。

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

namespace System.Web.Mvc
{
    public interface IPagedList
    {
        int TotalCount
        {
            get;
            set;
        }

        int PageIndex
        {
            get;
            set;
        }

        int PageSize
        {
            get;
            set;
        }

        bool IsPreviousPage
        {
            get;
        }

        bool IsNextPage
        {
            get;
        }     
    }

    public class PagedList<T> : List<T>, IPagedList
    {
        public PagedList(IQueryable<T> source, int index, int pageSize)
        {
            this.TotalCount = source.Count();
            this.PageSize = pageSize;
            this.PageIndex = index;
            this.AddRange(source.Skip(index * pageSize).Take(pageSize).ToList());
        }    

        public PagedList(List<T> source, int index, int pageSize)
        {
            this.TotalCount = source.Count();
            this.PageSize = pageSize;
            this.PageIndex = index;
            this.AddRange(source.Skip(index * pageSize).Take(pageSize).ToList());
        }

        public int TotalCount      
        { 
            get; set; 
        }

        public int PageIndex       
        { 
            get; set; 
        }

        public int PageSize 
        { 
            get; set; 
        }

        public bool IsPreviousPage 
        { 
            get 
            {
                return (PageIndex > 0);
            }
        }

        public bool IsNextPage 
        { 
            get
            {
                return (PageIndex * PageSize) <=TotalCount;
            } 
        }        
    }

    public static class Pagination
    {
        public static PagedList<T> ToPagedList<T>(this IQueryable<T> source, int index, int pageSize) 
        {
            return new PagedList<T>(source, index, pageSize);
        }

        public static PagedList<T> ToPagedList<T>(this IQueryable<T> source, int index)
        {
            return new PagedList<T>(source, index, 10);
        }        
    }
}