我们在页面展示一个table表格的时候,当数据量较大时,常常会考虑到数据分页的问题,数据分页一般有三种方式,分别是前端数据分页,后端数据分页,数据库分页。
前端数据分页:是把所有数据加载到前端,然后在前端用js实现数据的分页,这种分页方式是最方便简单的,但是也是效果最差的。因为当数据量很大时,前端加载数据耗时很久,页面会因为加载数据而无法正常显示,体验很差。并且因为数据是一次性加载到前端,当数据库有新数据更新时,如果不刷新页面重新读取数据库,就无法获取最新数据。
后端数据分页:是在后端将数据全部查出来,,将前端需要显示的部分数据筛选出来,传回前端。这种方式相对于前端数据分页来说效果要好很多。前端只用回传当前页要显示的少量数据,前端接收到的数据量也很少,传输负担就会小很多,可以减轻页面加载延迟。后端数据分页的缺点和前端刷新一样,如果想获取新数据,就要重新从数据库中加载所有数据到后端。
数据库分页:数据库分页是最好的分页方式,在后端拼接查询sql的时候,就把前端需要展示部分的数据条件拼接出来。每次都重新查询数据库,可以获取到最新数据,每次从数据库查询的数据量,只有前端当前要显示的那一部分,大大减少了数据的传输,缺点是sql的拼接比较复杂。
作者对三种分页方式都进行了总结,分为三篇文章。本文为后端数据分页方法。
下面这个方法list参数是从数据库中查询出来的所有数据,paraDic是前端传来的显示参数,如当前页数,每页显示数量,准备跳转到的页数。
/// <summary>
/// 获取当前页要显示的数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="paraDic"></param>
/// <returns></returns>
public List<T> SplitPage<T>(List<T> list, ref Dictionary<string, string> paraDic)
{
//如果没有数据,直接返回一个空对象,避免因为返回null而前端报错
if (list.Count == 0)
{
paraDic["AllPageNum"] = "0";
return new List<T>();
}
//-1代表不分页,返回所有数据
if (paraDic["clickpagenow"] == "-1")
return list;
//每页显示的数据条数
int everyPage = Convert.ToInt32(paraDic["PageShowNum"]);
//计算总页数
paraDic["AllPageNum"] = ((int)Math.Ceiling((double)list.Count / (double)everyPage)).ToString();
//如果输入页数<=0,选择第一页
if(Convert.ToInt32(paraDic["clickpagenow"]) <= 0)
paraDic["clickpagenow"] = "1";
//如果输入页数>最大页,选择最大页
if (Convert.ToInt32(paraDic["clickpagenow"]) > Convert.ToInt32(paraDic["AllPageNum"]))
paraDic["clickpagenow"] = paraDic["AllPageNum"];
//当前显示页的第一条数据序号
int beginData = (Convert.ToInt32(paraDic["clickpagenow"]) - 1) * everyPage;
List<T> showList = new List<T>();
//获取当前显示页要显示的所有数据
if (beginData < list.Count && beginData + everyPage >= list.Count)//最后一页
{
for (int i = beginData; i < list.Count; i++)
{
showList.Add(list[i]);
}
}
else
{
for (int i = beginData; i < beginData + everyPage; i++)//正常页
{
showList.Add(list[i]);
}
}
return showList;
}