分页!万年老话题!4年前自己的分页泛型类
分页!万年老话题!4年前自己的分页泛型类
捍卫机密 发表于1年前
分页!万年老话题!4年前自己的分页泛型类
  • 发表于 1年前
  • 阅读 15
  • 收藏 1
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 4年前的一个晚上……月黑风高……

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

 

标签: c# 分页
共有 人打赏支持
粉丝 3
博文 109
码字总数 30525
评论 (0)
×
捍卫机密
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: