文档章节

分页!万年老话题!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
码字总数 48320
作品 0
成都
程序员
私信 提问
一线城市年薪30万以上的程序员,他们真实生活状态怎样?

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

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

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

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

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

DeepTech深科技
2018/03/21
0
0
企业家专栏 | 马化腾:互联网是不是很像一个不确定的,正在爆炸的星系?

▲这个世界残酷,又温暖。 本周开启一个新的专栏:对标创始人/企业家。第一位,就是20年前用一只憨态可掬的小企鹅撬开互联网大门,建立腾讯帝国的47岁年轻企业家马化腾。 一个不确定的,正在...

竹说
2018/12/17
0
0
人类“出走”非洲又早 4 万年!科学家在以色列发现一个古老颌骨

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

DeepTech深科技
2018/01/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

对Docker了解多少?10分钟带你从入门操作到实战上手

Docker简述 Docker是一种OS虚拟化技术,是一个开源的应用容器引擎。它可以让开发者将应用打包到一个可移植的容器中,并且该容器可以运行在几乎所有linux系统中(Windows10目前也原生支持,W...

别打我会飞
28分钟前
1
0
Java自定义注解及应用

前沿 java目前只内置了三种标准注解 注解 解释 @Override 表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示 @Depreca...

细节探索者
32分钟前
1
0
Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能

视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash制作的播放器来播放该文件.项目中用制作的player.swf播放器. 多媒体视频处理工具FFmpeg有非常强大...

红土豆
35分钟前
1
0
谈谈lucene的DocValues特性之SortedDocValuesField

lucene的DocValues不同于document文档级别的存储,它是一个面向列的存储结构,提供从文档编号到值的映射功能。根据不同的数据类型和应用场景支持多个DocValuesField类型,SortedDocValuesFi...

FAT_mt
49分钟前
3
0
漏洞防御与修复工作

导读 漏洞管理工作是企业安全建设必不可少的一环,在风险管理工作中,漏洞管理能够防患于未然,企业对漏洞管理有着广泛的基础建设和实践经验。但随着攻防技术的发展,传统漏洞管理的安全技术...

问题终结者
52分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部