我们在页面展示一个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;
        }