分页的原理是将本页的数据通过查询拿出来,当数据很巨大时,不用全部拿出来,影响效率。
第一步拿数据:
sql server下的分页查询:
select * from (select *,Row_Number() over(order by id) nums from tableName) tableName where nums > 2 and nums < 10
检索 2-10的数据,这里必须用到子查询。因为设置 nums的条件时,nums必须为表里有的字段。
mysql下的分页查询:
SELECT * FROM USER LIMIT 2,5
检索从3开始的5条数据,比起ms sql简单了点
接下来需要封装一个分页类,将分页用到的数据封装进去。封装的数据有要显示的多条数据,所以这个类就继承List<T>
public class PageinatedList<T> : List<T>{private int pageIndex;private int pageSize;private int totalCount;private int totalPages;/// <summary>/// 当前页码/// </summary>public int PageIndex{set { pageIndex = value; }get { return pageIndex; }}/// <summary>/// 每页个数/// </summary>public int PageSize{set { pageSize = value; }get { return pageSize; }}/// <summary>/// 数据总数/// </summary>public int TotalCount{set { totalCount = value; }get { return totalCount; }}/// <summary>/// 可分页数/// </summary>public int TotalPages{set { totalPages = value; }get { return totalPages; }}public PageinatedList(IQueryable<T> table, int pageIndex, int pageSize){this.PageIndex = pageIndex;this.PageSize = pageSize;this.TotalCount = table.Count();this.TotalPages = TotalCount / PageSize;this.AddRange(table.Skip(pageIndex*PageSize).Take(PageSize));}}
这里我用到的是linq查询,linq查询返回的是一个 IQueryable<T> 接口 下的一个子类。所以我这里构造函数就传进去一个IQueryable<T> table
用linq查询出来,然后封装进分页类。返回给页面。这样就能拿到数据和分页用到的属性
public ActionResult Index(){var select = from c in ent.学生 orderby c.学号 select c;var pageinated = new PageinatedList<学生>(select,0,10);return View(pageinated);}public ActionResult Pages(int page){var select = from c in ent.学生 orderby c.学号 select c;var pageinated = new PageinatedList<学生>(select, page, 10);return View(pageinated);}
function changePage(i) {$.post("Pages?Page=" + i, function (data) {$("#mytr").html(data);});}
通过ajax来改变数据。