文档章节

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

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

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

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

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

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

DeepTech深科技
03/21
0
0
基于SSM和jstl的分页实现教程

以前用jsp和原生的JDBC实现过分页,现在一看,不仅代码冗余,而且可读性差,今天分享一种简洁的实现方式,我用起来是很方便的。 一.概述 主要思想就是建一个Page类,所有跟分页有关的参数都放...

lovellypop的博客
2017/12/12
0
0
人类“出走”非洲又早 4 万年!科学家在以色列发现一个古老颌骨

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

DeepTech深科技
01/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数字转换为字符的L受哪个参数影响

我们知道,如果想把金额带上本位币,一般加上L, 比如: select to_char(salary,'L99,9999.00') from employees; 下面显示如下: SALARY TO_CHAR(SALARY,'L99, 2900 ¥2,900.00 2500 ¥2,500.00 ...

tututu_jiang
13分钟前
0
0
shell编程(告警系统主脚本、告警系统配置文件、告警系统监控项目)

告警系统主脚本 先定义监控系统的各个目录,然后再去定义主脚本,因为是分布式的,所以需要每台机器都这样做,如果事先有创建好各个目录和各个脚本,那么就可以把这些目录和脚本copy到其他机...

蛋黄_Yolks
13分钟前
0
0
SAP HANA Backup and Recovery

SAP HANA Backup and Recovery Skip to end of metadata Created by Paul Power, last modified on Nov 23, 2017 Go to start of metadata Purpose System Privileges How to Perform a Back......

rootliu
15分钟前
0
0
JVM的持久代——何去何从?

本文会介绍一些JVM内存结构的基本概念,然后很快会讲到持久代,来看下Java SE 8发布后它究竟到哪去了。 基础知识 JVM只不过是运行在你系统上的另一个进程而已,这一切的魔法始于一个java命令...

java知识分子
32分钟前
0
0
Hive和HBase的区别

hive是文件的视图,hbase是建了索引的key-value表。 先放结论:Hbase和Hive在大数据架构中处在不同位置,Hbase主要解决实时数据查询问题,Hive主要解决数据处理和计算问题,一般是配合使用。...

飓风2000
38分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部