一、单表分页

if exists(select * from sysobjects where name='proc_movies')drop proc proc_movies
go
create proc proc_movies
@pagesize int --每页显示的条数
,@pageindex int  --页码
,@count int output--输出总条数
,@pagecount int output--输出总页数
as
begin
select top (@pagesize)* from Movies where MovieID not in (select top (@pagesize*(@pageindex-1)) MovieID from Movies)
set @count=(select count(*) from Movies) --给要输出的总条数赋值
set @pagecount= CEILING(@count*1.0/@pagesize) --给要输出的总页数赋值
end
--调用
go
begin
--声明变量
declare @count int,--总条数
@pagecount int,--总页数
@pagesize int,--传入一页显示多少条
@pageindex int--传入页码
--调用存储过程,获取值
exec proc_movies @pagesize=8,@pageindex=1, @count=@count output,@pagecount=@pagecount output
select @count
select @pagecount
end

二、任意表分页

if exists(select * from sysobjects where name='proc_GetDBMoviePaging')drop proc proc_GetDBMoviePaging
gocreate proc proc_GetDBMoviePaging(@IDName varchar(20),--主键名@TableName varchar(20),--表名@PageIndex int,--当前页@PageSize int,--分页大小@PageCount int output,--总页数@Count int output  --总条数
)
as
begin
--主查询语句
declare @sql varchar(1000)='select top '+ cast(@PageSize as varchar(4)) +' * from '+@TableName+
' where '+@IDName+' not in ( select top '+cast((@PageIndex-1)*@PageSize as varchar(4))+' '+@IDName+' from '+@TableName+')'
--执行主查询语句
exec (@sql)
--查询总条数语句
declare @sqlCount Nvarchar(1000)
set @sqlCount='select @Count =count(*) '+' from '+@TableName
--执行总条数语句
exec sp_executesql @sqlCount,N'@Count int output',@Count output
--给总页数赋值
select @PageCount=CEILING(@Count*1.0/@PageSize)--向上取整
end--执行存储过程
go
begin
declare @IDName varchar(20)='MovieID'
declare @TableName varchar(20)='movies'
declare @PageIndex int
declare @PageSize int
declare @PageCount int
declare @Count int exec  proc_GetDBMoviePaging @IDName,@TableName,@PageIndex=1,@PageSize=5,@PageCount=@PageCount output,@Count=@Count output
select @count
select @pagecount
end

三、EF调用分页存储过程

将分页的过程进行一些封装,尽量减少代码的耦合

1.一个分页的参数类

    public class Paging{/// <summary>/// 表主键/// </summary>public string IDName { get; set; }/// <summary>/// 表名/// </summary>public string TableName { get; set; }/// <summary>/// 页码/// </summary>public int PageIndex { get; set; } = 1;/// <summary>/// 分页大小/// </summary>public int PageSize { get; set; } = 5;public Paging(string idname,string tablename,int pageindex,int pageSize){this.IDName = idname;this.TableName = tablename;this.PageIndex = PageIndex;this.PageSize = pageSize;}}

2.一个分页的返回值类

public class PageResult<T>{/// <summary>/// 总页数/// </summary>public int PageCount { get; set; }/// <summary>/// 总条数/// </summary>public int Count { get; set; }/// <summary>/// 数据集/// </summary>public List<T> Data { get; set; }}

3.一个分页的工具类

GetPagingData<T>这个方法有两个参数,第一个是一个分页参数,第二个是泛型类用来传入类型的。

public class PageTool{public static PageResult<T> GetPagingData<T>(Paging paging){PageResult<T> pageResult = new PageResult<T>();//准备执行存储过程分页的参数var pPageCount = new SqlParameter("PageCount", SqlDbType.Int){ Value = pageResult.PageCount, Direction = ParameterDirection.Output };//总页数,ParameterDirection.Output设置为输出参数var pCount = new SqlParameter("Count", SqlDbType.Int){ Value = pageResult.Count, Direction = ParameterDirection.Output };//总条数var paramters = new SqlParameter[]{new SqlParameter("IDName",SqlDbType.VarChar) { Value=paging.IDName},new SqlParameter("TableName", SqlDbType.VarChar) {Value =paging.TableName},new SqlParameter("PageIndex",SqlDbType.Int) { Value=paging.PageIndex},new SqlParameter("PageSIze",SqlDbType.Int) { Value=paging.PageSize},pPageCount,pCount};//通过委托调用存储过程string sql = @"exec proc_GetDBMoviePaging @IDName,@TableName,@PageIndex,@PageSize,@PageCount=@PageCount output,@Count=@Count output";using (Movie_ticketingEntities db = new Movie_ticketingEntities()){pageResult.Data = db.Database.SqlQuery<T>(sql, paramters).ToList();}//pageResult.Data = f(paramters,sql);//给需要返回的总页数,和总条数赋值pageResult.PageCount = Convert.ToInt32(pPageCount.Value.ToString());pageResult.Count = Convert.ToInt32(pCount.Value.ToString());return pageResult;}}

4.DAL层调用分页的帮助类,返回值是分页返回值类,里面有一个泛型,会根据传入PageTool的取推断类型,传入的是Movies,那么List<T>就是List<Movies>

        /// <summary>/// 查询电影/// </summary>/// <param name="paging"></param>/// <returns></returns>public static PageResult<Movies> GetPageMovies(Paging paging){var result= PageTool.GetPagingData<Movies>(paging);return result;}/// <summary>/// 查询日志/// </summary>/// <param name="paging"></param>/// <returns></returns>public static PageResult<journal> GetPageJournals(Paging paging){var result = PageTool.GetPagingData<journal>(paging);return result;}}

5.用BLL调用,DAL返回的是封装好的PageResult分页结果类,要得到其中的集合需要自取

        public static List<Movies> GetMovie(Paging paging){var result= MovieService.GetPageMovies(paging);return result.Data;}public static List<journal> GetJournal(Paging paging){var result = MovieService.GetPageJournals(paging);return result.Data;}

6.UI层调用

List<journal> journals = MovieManager.GetJournal(new Paging("journalID", "journal", 2, 5));
List<Movies> movies = MovieManager.GetMovie(new Paging("MovieID", "Movies", 2, 5));

最后调试,没有问题

存储过程分页——单表分页,任意表分页,EF调用分页存储过程相关推荐

  1. java 创建存储过程_如何在pl/sql中创建及调用JAVA存储过程 | 学步园

    1.创建一个java存储过程helloworld create or replace and compile java source named helloworld as public class ...

  2. C#调用Oracle存储过程分页

    直接调用Oracle中的存储过程完成对表的分页,对代码封闭程度高,执行高效.以下为C#分页类代码,包括Oracle数据库 端存储过程PLSQL代码. //    程序调用示例: // int tota ...

  3. php 分页 页数多,一个php页面多个分页共存

    PHP 分页 写了个php分页的自定义函数,用着感觉挺好: pageFunc($dataNum,$pageSize,$pageName)//记录集,每页显示的条数,分页名 今天突然在想,如果我一个页面 ...

  4. mysql分片库分页查询_Mysql分库分表

    一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连接可用.接下来就 ...

  5. 数据库分库分表和带来的唯一ID、分页查询问题的解决

    数据库分库分表和带来的唯一ID.分页查询问题的解决 参考文章: (1)数据库分库分表和带来的唯一ID.分页查询问题的解决 (2)https://www.cnblogs.com/hanzhong/p/1 ...

  6. Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、连接(join、left join和right join简介及其区别)等案例之详细攻略

    Database之SQLSever:SQL命令实现查询之多表查询.嵌套查询.分页复杂查询,删除表内重复记录数据.连接(join.left join和right join简介及其区别)等案例之详细攻略 ...

  7. Oracle Chp3 复杂查询 key point:数据分页;子查询;表连接;集合运算符

    分页查询练习 1.查询工资最高的3名员工信息 按照工资排序 利用rownum排序 select t1.* from (select * from employees order by salary d ...

  8. mysql分页分表_mysql分表后 如何分页 (总共160个表1500万数据)

    mysql分表后,有160个表,有1500万数据,要怎么做分页列表? 之前是想用union all合并160个表的结果集..但直接卡的数据都出不来.. 请问这里应该怎么做分页,谢谢~~~ 回复讨论(解 ...

  9. ①隔若干行插入分页符②排签排版③按条件分页④按行拆分工作表

    ​​​​​​关于打印与分页的4个高级技巧 ①隔若干行插入分页符,相当于按规律手动分页 ②排签排版,相当于分栏打印 ③按条件分页,使一页中只支持一个类别的数据 ④按行数拆分工作表,从而使用每页都能打印顶 ...

最新文章

  1. Java xml 工具 JDOM 使用详解.
  2. Winform将网页生成图片
  3. 香草 jboss 工具_如何为JBoss Developer Studio 8设置BPM和规则工具
  4. 前端学习(2259)查看历史
  5. html标签api,html5新增标签+API介绍
  6. ASP.NET MVC框架(第一部分)
  7. [Python] itertools.islice(iterable, start, stop[, step]) 创建迭代器并返回所选元素
  8. gcj编译java_GCJ编译java程序的头痛问题
  9. switch怎么用字符c语言,switch怎么用c语言-switch用c语言讲解
  10. C语言:51单片机看这一篇就够了
  11. 夜曲歌词 拼音_《夜曲》的歌词 - 歌手:周杰伦 (Jay Chou)
  12. Spark机器学习实验
  13. GNSS 使用DFT算法 能量损耗仿真
  14. Python使用Plotly绘图工具,绘制散点图、线形图
  15. 用java实现螺旋矩阵算法
  16. 微服务和分布式的区别什么?有什么特点?
  17. 利用sikuli插件辅助实现自动化脚本
  18. influx的常规操作
  19. xgboost解决业务问题实践——司机流失预测模型
  20. COCOS2D-X 单机游戏防八门神器修改数据

热门文章

  1. 2D手机游戏的即时阴影效果
  2. RK3399平台开发系列讲解(内核驱动外设篇)6.14、ES8323音频芯片驱动分析
  3. 如何快速注册google邮箱
  4. microtime函数
  5. 1.21 几种在控制台输出日志的方式 [原创iOS开发-Xcode教程]
  6. 【AtomicLong】常规用法
  7. “蓝桥杯”练习系统 基础练习
  8. linux备份华为交换机,利用expect脚本实现备份华为交换机配置之(一)
  9. python公众号推荐 知乎_爬取公众号及知乎专栏文章的标题链接的方法汇总
  10. android屏幕灯功能吗,呼吸灯有什么用 手机呼吸灯作用大公开【图文】