首页 > 代码库 > Mvc Linq 分页 参考PagedList

Mvc Linq 分页 参考PagedList

  第一次写博客 写的不好各位大神多多包涵。

  我的分页主要是针对Linq 分页来写的,针对IEnumerable<T>  和 IQueryable<T> 类型数据分页。 开始上代码

  创建接口:

public interface IPagedList    {        /// <summary>        /// 总记录数        /// </summary>        int TotalCount { get; set; }        /// <summary>        /// 总页数        /// </summary>        int TotalPages { get; set; }        /// <summary>        /// 当前页        /// </summary>        int PageIndex { get; set; }        /// <summary>        /// 页面大小        /// </summary>        int PageSize { get; set; }        /// <summary>        /// 是否上一页        /// </summary>        bool IsPreviousPage { get; }        /// <summary>        /// 是否下一页        /// </summary>        bool IsNextPage { get; }    }

泛型实体类:PagedQueryableToListModel<T>(实现IQueryable集合的数据),PagedCacheToListModel<T> (实现List集合的数据)我在这里重载构造函数实现根据参数不同调用不同构造函数 代码如下:

  1 //PagedQueryableToListModel<T>泛型类      2 public class PagedQueryableToListModel<T> : List<T>,IPagedList  3     {  4         /// <summary>  5         /// 数据源为IQueryable的范型  6         /// </summary>  7         /// <param name="source">数据源</param>  8         /// <param name="index">当前页</param>  9         /// <param name="pageSize">页大小</param> 10         public PagedQueryableToListModel(IQueryable<T> source, int index, int pageSize) 11         { 12             //判断传过来的实体集是否为空 13             if(source != null) 14             { 15                 int total = source.Count(); 16                 this.TotalCount = total; 17                 this.PageSize = pageSize; 18                 this.TotalPages = total / pageSize; 19                 if (total % pageSize > 0) 20                     TotalPages++; 21                 this.PageSize = PageSize; 22                 if (index > this.TotalPages) 23                 { 24                     index = this.TotalPages; 25                 } 26                 if (index < 1) 27                 { 28                     index = 1; 29                 } 30                 this.PageIndex = index; 31                 List<T> resultSet = source.Skip((PageIndex-1) * PageSize).Take(PageSize).ToList(); 32                 this.AddRange(resultSet);//Skip跳过指定条数,Take返回多少条 33             } 34         } 35  36         /// <summary> 37         /// 数据源为IQueryable的范型 38         /// </summary> 39         /// <param name="source">数据源</param> 40         /// <param name="index">当前页</param> 41         /// <param name="pageSize">页大小</param> 42         public PagedQueryableToListModel(IQueryable<T> source, int index, int pageSize, out int totalCount) 43         { 44             //判断传过来的实体集是否为空 45             if (source != null) 46             { 47                 totalCount = source.Count(); 48                 this.TotalCount = totalCount; 49                 this.PageSize = pageSize; 50                 this.TotalPages = totalCount / pageSize; 51                 if (totalCount % pageSize > 0) 52                     TotalPages++; 53                 this.PageSize = PageSize; 54                 if (index > this.TotalPages) 55                 { 56                     index = this.TotalPages; 57                 } 58                 if (index < 1) 59                 { 60                     index = 1; 61                 } 62                 this.PageIndex = index; 63                 List<T> resultSet = source.Skip((PageIndex - 1) * PageSize).Take(PageSize).ToList(); 64                 this.AddRange(resultSet);//Skip跳过指定条数,Take返回多少条 65             } 66             else 67             { 68                 totalCount = 0; 69             } 70         } 71  72         /// <summary> 73         /// 总记录数 74         /// </summary> 75         public int TotalCount { get; set; } 76         /// <summary> 77         /// 总页数 78         /// </summary> 79         public int TotalPages { get; set; } 80         /// <summary> 81         /// 当前页 82         /// </summary> 83         public int PageIndex { get; set; } 84         /// <summary> 85         /// 页面大小 86         /// </summary> 87         public int PageSize { get; set; } 88         /// <summary> 89         /// 是否上一页 90         /// </summary> 91         public bool IsPreviousPage 92         { 93             get 94             { 95                 return PageIndex-1 > 0; 96             } 97         } 98         /// <summary> 99         /// 是否下一页100         /// </summary>101         public bool IsNextPage102         {103             get104             {105                 return (PageIndex * PageSize) < TotalCount;106             }107         }108 109         110     }
  1 // PagedCacheToListModel<T>泛型类      2 public class PagedCacheToListModel<T> : List<T>, IPagedList  3     {  4         /// <summary>  5         /// 数据源为List的范型  6         /// </summary>  7         /// <param name="source">数据源</param>  8         /// <param name="index">当前页</param>  9         /// <param name="pageSize">页大小</param> 10         public PagedCacheToListModel(List<T> source, int index, int pageSize) 11         { 12             //判断传过来的实体集是否为空 13             if(source != null) 14             { 15                 int total = source.Count; 16                 this.TotalCount = total; 17                 this.PageSize = pageSize; 18                 this.TotalPages = total / pageSize; 19                 if (total % pageSize > 0) 20                     TotalPages++; 21                 this.PageSize = PageSize; 22                 if (index > this.TotalPages) 23                 { 24                     index = this.TotalPages; 25                 } 26                 if (index < 1) 27                 { 28                     index = 1; 29                 } 30                 this.PageIndex = index; 31                 List<T> resultSet = source.Skip((PageIndex-1) * PageSize).Take(PageSize).ToList(); 32                 this.AddRange(resultSet);//Skip跳过指定条数,Take返回多少条 33             } 34         } 35  36         /// <summary> 37         /// 数据源为List集合数据 38         /// </summary> 39         /// <param name="source">数据源</param> 40         /// <param name="index">当前页</param> 41         /// <param name="pageSize">页大小</param> 42         public PagedCacheToListModel(List<T> source, int index, int pageSize, out int totalCount) 43         { 44             //判断传过来的实体集是否为空 45             if (source != null) 46             { 47                 totalCount = source.Count; 48                 this.TotalCount = totalCount; 49                 this.PageSize = pageSize; 50                 this.TotalPages = totalCount / pageSize; 51                 if (totalCount % pageSize > 0) 52                     TotalPages++; 53                 this.PageSize = PageSize; 54                 if (index > this.TotalPages) 55                 { 56                     index = this.TotalPages; 57                 } 58                 if (index < 1) 59                 { 60                     index = 1; 61                 } 62                 this.PageIndex = index; 63                 List<T> resultSet = source.Skip((PageIndex - 1) * PageSize).Take(PageSize).ToList(); 64                 this.AddRange(resultSet);//Skip跳过指定条数,Take返回多少条 65             } 66             else 67             { 68                 totalCount = 0; 69             } 70  71         } 72  73         /// <summary> 74         /// 总记录数 75         /// </summary> 76         public int TotalCount { get; set; } 77         /// <summary> 78         /// 总页数 79         /// </summary> 80         public int TotalPages { get; set; } 81         /// <summary> 82         /// 当前页 83         /// </summary> 84         public int PageIndex { get; set; } 85         /// <summary> 86         /// 页面大小 87         /// </summary> 88         public int PageSize { get; set; } 89         /// <summary> 90         /// 是否上一页 91         /// </summary> 92         public bool IsPreviousPage 93         { 94             get 95             { 96                 return PageIndex-1 > 0; 97             } 98         } 99         /// <summary>100         /// 是否下一页101         /// </summary>102         public bool IsNextPage103         {104             get105             {106                 return (PageIndex * PageSize) < TotalCount;107             }108         }109 110     }

构建泛型方法调用分页实体类

 1     public static class ExtendPagedList 2     { 3  4         /// <summary> 5         /// static方法 传递linq返回分页数据 6         /// </summary> 7         /// <typeparam name="T">IQueryable集合</typeparam> 8         /// <param name="linq">数据源</param> 9         /// <param name="pageIndex">当前页</param>10         /// <param name="pageSize">页面大小</param>11         /// <returns></returns>12         public static PagedQueryableToListModel<T> ToPagedList<T>(this IQueryable<T> linq, int pageIndex, int pageSize)13         {14             return new PagedQueryableToListModel<T>(linq, pageIndex, pageSize);15         }16 17         /// <summary>18         /// static方法 传递linq返回分页数据  及 数据总数19         /// </summary>20         /// <typeparam name="T">IQueryable集合</typeparam>21         /// <param name="linq"></param>22         /// <param name="pageIndex"></param>23         /// <param name="pageSize"></param>24         /// <param name="totalCount">返回数据总数</param>25         /// <returns></returns>26         public static PagedQueryableToListModel<T> ToPagedList<T>(this IQueryable<T> linq, int pageIndex, int pageSize, out int totalCount)27         {28             return new PagedQueryableToListModel<T>(linq, pageIndex, pageSize, out totalCount);29         }30         /// <summary>31         /// 返回List集合分页数据32         /// </summary>33         /// <typeparam name="T">List集合</typeparam>34         /// <param name="list"></param>35         /// <param name="pageIndex"></param>36         /// <param name="pageSize"></param>37         /// <returns></returns>38         public static PagedCacheToListModel<T> PagedCacheToList<T>(this List<T> list, int pageIndex, int pageSize)39         {40             return new PagedCacheToListModel<T>(list, pageIndex, pageSize);41         }42         /// <summary>43         /// 返回List集合分页数据 及 数据总数44         /// </summary>45         /// <typeparam name="T">List集合</typeparam>46         /// <param name="list"></param>47         /// <param name="pageIndex"></param>48         /// <param name="pageSize"></param>49         /// <param name="totalCount">返回总数</param>50         /// <returns></returns>51         public static PagedCacheToListModel<T> PagedCacheToList<T>(this List<T> list, int pageIndex, int pageSize, out int totalCount)52         {53             return new PagedCacheToListModel<T>(list, pageIndex, pageSize, out totalCount);54         }55     }

之后是Controller中ActionResult方法返回数据

 1         public ActionResult Index(int indexPage=1, int pageSize=5) 2         { 3             XiaoMiViewModel miView = new XiaoMiViewModel(); 4             using(XiaoMiEntities db =new XiaoMiEntities()) 5             { 6                 //IQueryable集合 7                 var xiaomiSet1 = (from i in db.xiaomi 8                                  orderby i.id 9                                  select new XiaoMiModel10                                      {11                                          id = i.id,12                                          username = i.username,13                                          email = i.email14                                      }).AsQueryable();15                 16                 int totalCount = default(int);//总数17                 //此处为IQueryable集合18                 miView.PageData = http://www.mamicode.com/ExtendPagedList.ToPagedList(xiaomiSet1, indexPage, pageSize, out totalCount);19 20                 //list集合数据21                 var xiaomiSet2 = (from i in db.xiaomi22                                  orderby i.id23                                  select new XiaoMiModel24                                  {25                                      id = i.id,26                                      username = i.username,27                                      email = i.email28                                  }).ToList();29                 //此处为list数据集合30                 miView.CachePageData = http://www.mamicode.com/ExtendPagedList.PagedCacheToList(xiaomiSet2, indexPage, pageSize, out totalCount);31                 miView.TotalCount = totalCount;32             }33             return View(miView);34         }
View Code

在razor视图中展示分页数据

@model PagedListModel.ViewModels.XiaoMiViewModel@{    ViewBag.Title = "Index";}<h2>IQueryable集合(sql直接分页)数据分页</h2>@foreach (var Data in Model.PageData.ToList()){    <p>ID:@Data.id : @Data.username</p>}<!--IQueryable集合(sql直接分页)数据分页 Start--><p>    总数:@Model.TotalCount    <br />    @if (Model.PageData.IsPreviousPage)    {        <a href=http://www.mamicode.com/"@Url.Action("Index", "Test", new { indexPage = Model.PageData.PageIndex - 1 })">上一页</a>    }    else    {        <em style="color:Gray">上一页</em>    }    @if (Model.PageData.IsNextPage)    {        <a href=http://www.mamicode.com/"@Url.Action("Index", "Test", new { indexPage = Model.PageData.PageIndex + 1 })">下一页</a>    }    else    {        <em style="color:Gray">下一页</em>    }</p><br /><hr /><h2>List数据直接分页</h2><!--end-->@foreach (var Data in Model.CachePageData.ToList()){    <p>ID:@Data.id : @Data.username</p>}<!--直接list集合数据分页 Start--><p>    总数:@Model.TotalCount     <br />    @if (Model.CachePageData.IsPreviousPage)    {        <a href=http://www.mamicode.com/"@Url.Action("Index", "Test", new { indexPage = Model.CachePageData.PageIndex - 1 })">上一页</a>    }    else    {        <em style="color:Gray">上一页</em>    }    @if (Model.CachePageData.IsNextPage)    {        <a href=http://www.mamicode.com/"@Url.Action("Index", "Test", new { indexPage = Model.CachePageData.PageIndex + 1 })">下一页</a>    }    else    {        <em style="color:Gray">下一页</em>    }</p><!--end-->
View Code

好了 以上就是分页所有步骤了 。。。。