文档章节

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

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

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;
        }

 

© 著作权归作者所有

共有 人打赏支持
捍卫机密
粉丝 3
博文 114
码字总数 34202
作品 0
成都
程序员
一线城市年薪30万以上的程序员,他们真实生活状态怎样?

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

qq_41807409 ⋅ 05/25 ⋅ 0

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

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

拉米拉科技 ⋅ 2017/12/29 ⋅ 0

《Science》登考古新发现:气候变化竟然是人类创新的重要动力

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

DeepTech深科技 ⋅ 03/21 ⋅ 0

基于SSM和jstl的分页实现教程

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

lovellypop的博客 ⋅ 2017/12/12 ⋅ 0

Django REST Framework 教程5 关系和超链接API

Tutorial 5: Relationships & Hyperlinked APIs src 到目前为止,在我们的API中关系(relationship)还是通过主键来表示的。在这部分的教程中,我们将用超链接方式来表示关系,从而提升API的...

readilen ⋅ 04/28 ⋅ 0

jquery.pagination.js分页

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

charley158 ⋅ 2014/01/06 ⋅ 0

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

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

DeepTech深科技 ⋅ 01/27 ⋅ 0

大哥你的通用的泛型Dao有几个关联额类,分页之类的额,可否完整分享下

@F风向标F 你好,想跟你请教个问题:大哥你的通用的泛型Dao有几个关联额类,分页之类的额,可否完整分享下

梦幻之旅 ⋅ 2016/07/27 ⋅ 0

Java开发

JVM 内存溢出实例 - 实战 JVM(二) 介绍 JVM 内存溢出产生情况分析 Java - 注解详解 详细介绍 Java 注解的使用,有利于学习编译时注解 Java 程序员快速上手 Kotlin 11 招 这篇文章主要是写给...

掘金官方 ⋅ 01/04 ⋅ 0

“颠覆三观”的《人类简史:从动物到上帝》——东非走出的智人

很抱歉,开篇有些标题党了。这本书是信手偶得,作者赫拉利是一名游走于多个学科之间的历史学家,结合人类学、生态学、生物工程学来写作人类发展史,观点新颖,让人耳目一新。 人类简史封面 ...

知猪侠_CD ⋅ 2017/08/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何优雅的编程——C语言界面的一点小建议

我们鼓励在编程时应有清晰的哲学思维,而不是给予硬性规则。我并不希望你们能认可所有的东西,因为它们只是观点,观点会随着时间的变化而变化。可是,如果不是直到现在把它们写在纸上,长久以...

柳猫 ⋅ 33分钟前 ⋅ 0

从零手写 IOC容器

概述 IOC (Inversion of Control) 控制反转。熟悉Spring的应该都知道。那么具体是怎么实现的呢?下面我们通过一个例子说明。 1. Component注解定义 package cn.com.qunar.annotation;impo...

轨迹_ ⋅ 33分钟前 ⋅ 0

系统健康检查利器-Spring Boot-Actuator

前言 实例由于出现故障、部署或自动缩放的情况,会进行持续启动、重新启动或停止操作。它可能导致它们暂时或永久不可用。为避免问题,您的负载均衡器应该从路由中跳过不健康的实例,因为它们...

harries ⋅ 35分钟前 ⋅ 0

手把手教你搭建vue-cli脚手架-详细步骤图文解析[vue入门]

写在前面: 使用 vue-cli 可以快速创建 vue 项目,vue-cli很好用,但是在最初搭建环境安装vue-cli及相关内容的时候,对一些人来说是很头疼的一件事情,本人在搭建vue-cli的项目环境的时候也是...

韦姣敏 ⋅ 45分钟前 ⋅ 0

12c rman中输入sql命令

12c之前版本,要在rman中执行sql语句,必须使用sql "alter system switch logfile"; 而在12c版本中,可以支持大量的sql语句了: 比如: C:\Users\zhengquan>rman target / 恢复管理器: Release 1...

tututu_jiang ⋅ 59分钟前 ⋅ 0

Nginx的https配置记录以及http强制跳转到https的方法梳理

Nginx的https配置记录以及http强制跳转到https的方法梳理 一、Nginx安装(略) 安装的时候需要注意加上 --with-httpsslmodule,因为httpsslmodule不属于Nginx的基本模块。 Nginx安装方法: ...

Yomut ⋅ 今天 ⋅ 0

SpringCloud Feign 传递复杂参数对象需要注意的地方

1.传递复杂参数对象需要用Post,另外需要注意,Feign不支持使用GetMapping 和PostMapping @RequestMapping(value="user/save",method=RequestMethod.POST) 2.在传递的过程中,复杂对象使用...

@林文龙 ⋅ 今天 ⋅ 0

如何显示 word 左侧目录大纲

打开word说明文档,如下图,我们发现左侧根本就没有目录,给我们带来很大的阅读障碍 2 在word文档的头部菜单栏中,切换到”视图“选项卡 3 然后勾选“导航窗格”选项 4 我们会惊奇的发现左侧...

二营长意大利炮 ⋅ 今天 ⋅ 0

智能合约编程语言Solidity之线上开发工具

工具地址:https://ethereum.github.io/browser-solidity/ 实例实验: 1.创建hello.sol文件 2.调试输出结果

硅谷课堂 ⋅ 今天 ⋅ 0

ffmpeg 视频格式转换

转 Mp4 格式 #> ffmpeg -i input.avi -c:v libx264 output.mp4#> ffmpeg -i input.avi -c:v libx264 -strict -2 output.mp4#> ffmpeg -i input.avi -c:v libx264 -strict -2 -s 1......

Contac ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部