文档章节

分页!万年老话题!4年前自己的分页泛型类

捍卫机密
 捍卫机密
发布于 2016/09/29 22:40
字数 693
阅读 15
收藏 1

2017年3月24日有更新

3月27日,计算去掉了虚函数声明;不能再初始化函数中用虚函数。其实也可以。只是要注意父子类到底是引用的哪个!

//-----------------------------------------------------------------------
// <filename>PaginationModel.cs</filename>
// <author>weilai(魏莱)</author>
// <date>2017-3-24</date>
// <remark></remark>
//-----------------------------------------------------------------------

using Slwy.Newtonsoft.Json;
using System;
using System.Collections.Generic;

namespace Wl.x.Model
{
    /// <summary>
    /// 分页数据结构
    /// 自动计算分页,但是不参与sql生成和数据提取
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class PaginationModel<T>
    {
        /// <summary>
        /// 每页记录数
        /// </summary>
        public int PageSize { get; set; }

        /// <summary>
        /// 实际每页记录数,最后一页记录数可能少于每页记录数
        /// </summary>
        public int ActualPageSize { get; protected set; }

        /// <summary>
        /// 页索引数
        /// </summary>
        public int PageIndex { get; set; }

        /// <summary>
        /// 当页起始记录数,为sql server分页sql语句准备的数据
        /// 同样适用于 mysql 中(limit n, m)分页 计算的起始记录(n)数字号
        /// </summary>
        public int PageStartCount { get; set; }

        /// <summary>
        /// 总记录数
        /// </summary>
        [JsonProperty("TotalCount")]
        public int TotalRecordCount { get; set; }

        /// <summary>
        /// 总页数
        /// </summary>
        [JsonProperty("TotalPage")]
        public int TotalPageCount { get; set; }

        /// <summary>
        /// SQL server下,分页第一次查询的数量
        /// </summary>
        public long TopCount { get; set; }

        /// <summary>
        /// 数据队列
        /// </summary>
        [JsonProperty("Data")]
        public List<T> PageContent { get; set; } = new List<T>();

        /// <summary>
        /// 初始化空分页结构,多用于json结构反序列化时生成用
        /// </summary>
        public PaginationModel()
        {
        }

        /// <summary>
        /// 初始化分页
        /// </summary>
        /// <param name="pageSize">每页记录数</param>
        /// <param name="pageIndex">当前页索引数</param>
        /// <param name="totalRecordCount">总记录数</param>
        protected PaginationModel(int pageSize, int pageIndex, int totalRecordCount)
        {
            this.PageSize = pageSize;
            this.TotalRecordCount = totalRecordCount;
            this.PageIndex = pageIndex;
            PageContent = new List<T>();
            Compute();
        }

        /// <summary>
        /// 用于快速的生成一个分页数据
        /// </summary>
        /// <param name="pageSize"></param>
        /// <param name="pageIndex"></param>
        /// <param name="totalRecordCount"></param>
        /// <returns></returns>
        public static PaginationModel<T> CreatePageData(int pageSize, int pageIndex, int totalRecordCount)
        {
            return new PaginationModel<T>(pageSize, pageIndex, totalRecordCount);
        }

        /// <summary>+
        /// 计算分页数据
        /// </summary>
        protected void Compute()
        {
            #region -- 计算分页数据 --

            PageSize = PageSize < 1 ? 20 : PageSize;//默认20
            int lastPage = Convert.ToInt32(TotalRecordCount % PageSize);//计算最后一页记录数
            TotalPageCount = Convert.ToInt32(TotalRecordCount / PageSize) + (lastPage > 0 ? 1 : 0);//计算总页数
            PageIndex = PageIndex > TotalPageCount ? TotalPageCount : PageIndex;//检查当前页数大
            PageIndex = PageIndex < 1 ? 1 : PageIndex;//检查当前页小
            TopCount = PageIndex * PageSize;//sqlite中用的 top 多少记录数,比sql server少pagesize个
            ActualPageSize = (PageIndex == TotalPageCount && lastPage != 0) ? lastPage : PageSize;//判断是否最后一页,并指定页记录数
            PageStartCount = (PageIndex - 1) * PageSize;//sql server用的,同样适用于mysql

            #endregion -- 计算分页数据 --
        }

        /// <summary>
        /// 添加一个数据
        /// </summary>
        /// <param name="item"></param>
        public void AddItem(T item)
        {
            if (this.PageContent != null)
            {
                this.PageContent.Add(item);
            }
        }

        /// <summary>
        /// 添加一组数据
        /// </summary>
        /// <param name="items"></param>
        public void AddItems(IEnumerable<T> items)
        {
            if (this.PageContent != null)
            {
                this.PageContent.AddRange(items);
            }
        }
    }

}

/// <summary>
        /// 分页扩展
        /// </summary>
        /// <typeparam name="TData"></typeparam>
        /// <param name="self"></param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <returns></returns>
        public static PaginationModel<TData> PageForList<TData>(this List<TData> self, int pageIndex, int pageSize)
        {
            PaginationModel<TData> p = PaginationModel<TData>.CreatePageData(pageSize, pageIndex, self.Count);
            // 分页 Skip跳过前[p.PageStartCount]条,Take获取[Size]条数据
            var pageOrder = self.Skip(p.PageStartCount).Take(p.PageSize).ToList();
            p.AddItems(pageOrder);
            return p;
        }

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 泛型排序
捍卫机密
粉丝 5
博文 126
码字总数 45485
作品 0
成都
程序员
私信 提问
一线城市年薪30万以上的程序员,他们真实生活状态怎样?

程序猿(媛)一个神秘而神圣的职业,外行觉得他们是改变世界、颠覆行业的救世主,其实我们真没这么大能力,因为每天都在"接需求、实现需求、改需求"的闭环中前行。外行都觉得程序员工资高出天...

qq_41807409
05/25
0
0
地球生命死亡周期是2600万年灭绝一次,存活的人类只有2000多人

关于地球生命死亡周期,科学家们的争论已经持续超过了30年。现在,科学家们根据彗星和小行星的轨迹和地球上的痕迹来看,彗星和小行星雨的多重轰炸是地球生命的灾难,所以,科学家们得出的结论...

拉米拉科技
2017/12/29
0
0
《Science》登考古新发现:气候变化竟然是人类创新的重要动力

  大约30万年前,人类开始登上历史的舞台。之后的岁月里,我们所诞生的这块大陆经历了数次环境剧变,每一次都可能改变人类进化的轨迹。   如今,在肯尼亚工作的考古学家们发现,气候波动...

DeepTech深科技
03/21
0
0
jquery.pagination.js分页

jquery.pagination.js分页 序言 这一款js分页使用起来很爽,自己经常用,做项目时总是要翻以前的项目看,不方便,这里就把他写出来方便自己以后粘帖,也希望能分享给大家。 友情提示下:我有...

charley158
2014/01/06
0
0
人类“出走”非洲又早 4 万年!科学家在以色列发现一个古老颌骨

  在以色列卡梅尔山(Mount Carmel)西坡一个倒塌的洞穴中,研究人员发现了一个古老人类的颌骨,它可能来自于离开非洲的第一批现代人类。当时,在这个地中海旁边的巨大洞穴里,古代人用燧石...

DeepTech深科技
01/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈“李氏代换”——从纪念金庸和斯坦李说起

李氏代换(LSP)简介 李氏代换是软件设计的一个原则,又名依赖倒转原则或依赖倒置原则,其衍生原则有接口分离原则等。该原则由Barbara Liskov于1988年提出。 该原则指出,程序中高级别的元素...

SamYjy
21分钟前
9
0
JavaScript实现在线websocket WSS测试工具 -toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
40分钟前
0
0
linux-scp 远程拷贝报错原因

刚拿到一台重装后的服务器,远程ssh都正常,但是一scp拷贝东西就报错: 本地确定是有scp命令的,而且如果是本地没有scp不会报后面那句lost connection,因此就是远程没有scp这个命令。因此在...

linuxprobe16
53分钟前
1
0
OSChina 周六乱弹 —— 谁小时候没当过熊孩子呀

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《行尸走肉》- amazarashi 《行尸走肉》- amazarashi 手机党少年们想听歌,请使劲儿戳(这里) @神话 :周五了,周末干啥...

小小编辑
今天
110
4
docker部署springboot项目

安装docker 菜鸟教程 springboot项目 maven依赖 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001......

yimingkeji
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部