在上个月发表的 http://www.cnblogs.com/bwangel/p/mvcpager.html 中,讨论了一下asp.net mvc中结合Entity framework框架进行的分页,包括服务端实现和客户端的分部视图的实现。在一个月过后,发现服务器端的代码每次都写一堆,非常冗长,基于职业习惯,想着把服务器端的分页代码也能封装一下,这是以前的代码:

        const int PAGE_SZ = 10;[Route("{id:int}/{page:int=1}")]public ActionResult Index(int? id, int? page){var articles = (id == null || id == 0) ? _db.Articles : _db.Articles.Where    (art => art.CatalogId == id);var recordCount = articles.Count();articles = articles.OrderByDescending(art => art.EditTime). Skip((page.Value - 1) * PAGE_SZ).Take(PAGE_SZ);ViewBag.Pager = new Pager(){PageIndex = page.Value,PageSize = PAGE_SZ,RecordCount = recordCount,};return View(articles);
}        

经过一翻折腾,在原有的Pager类中增加一个static方法:

        /// <summary>/// 根据指定的集合表达式和排序字段得出一个分页对象和分页后的数据集/// </summary>/// <typeparam name="T">实体的类型</typeparam>/// <typeparam name="TSort">用于排序的属性类型</typeparam>/// <param name="allList">初始的集合</param>/// <param name="orderExpress">排序的表达式</param>/// <param name="page">页号</param>/// <param name="pageSize">页数</param>/// <returns></returns>public static Pager GetPagedList<T, TSort>(ref IQueryable<T> allList,Expression<Func<T, TSort>> orderExpress, int? page, int pageSize = 20){int p = Math.Max(1, page == null ? 1 : page.Value);var recordCount = allList.Count();allList = allList.OrderByDescending(orderExpress).Skip((p - 1) * pageSize).Take(pageSize);return new Pager(){PageIndex = p,PageSize = pageSize,RecordCount = recordCount,};}

这样,上述应用层的调用就简化为:

        public ActionResult Index(int? id, int? page){var articles = (id == null || id == 0) ? _db.Articles : _db.Articles.Where(art => art.CatalogId == id);
//此方法要返回两个值,一个是分页对象,一个是分页后的集合。所以后者用ref传地址。 art=>art.Id是表示根据Id排序.            ViewBag.Pager = Pager.GetPagedList(ref articles, art => art.Id, page);return View(articles);}

虽然GetPagerList方法有两个泛型类型参数,但根据编译器的智能化处理,我们在调用时可以省略显示声明T和TSort,让编译器自动判断。
这样调用显得非常简洁。

当然此方法还可以做进一步封装,把条件查询表达式也一起封进去,但那样方法的定义会显得非常复杂和冗长,以现有的应用规模不划算,暂时没这必要。

经过了如此多的封装,Entity Framework是否能足够聪明,能高效智能地查询出我们想要的结果呢?我不太放心,特地跟踪了一下,发现

它和我们预期的表现完全一致,就两条语句,一条是整体计数,一条是具体的分页:

SELECT [GroupBy1].[A1] AS [C1]FROM ( SELECT COUNT(1) AS [A1]FROM [dbo].[CT_Article] AS [Extent1])  AS [GroupBy1]SELECT TOP (20) [Extent1].[Id] AS [Id], [Extent1].[ParentId] AS [ParentId], [Extent1].[Title] AS [Title], [Extent1].[Text] AS [Text], [Extent1].[Intro] AS [Intro], [Extent1].[CatalogId] AS [CatalogId], [Extent1].[AuthorId] AS [AuthorId], [Extent1].[ReplyCount] AS [ReplyCount], [Extent1].[HitCount] AS [HitCount], [Extent1].[PostTime] AS [PostTime], [Extent1].[LastReplyTime] AS [LastReplyTime], [Extent1].[Status] AS [Status]FROM ( SELECT [Extent1].[Id] AS [Id], [Extent1].[ParentId] AS [ParentId], [Extent1].[Title] AS [Title], [Extent1].[Text] AS [Text], [Extent1].[Intro] AS [Intro], [Extent1].[CatalogId] AS [CatalogId], [Extent1].[AuthorId] AS [AuthorId], [Extent1].[ReplyCount] AS [ReplyCount], [Extent1].[HitCount] AS [HitCount], [Extent1].[PostTime] AS [PostTime], [Extent1].[LastReplyTime] AS [LastReplyTime], [Extent1].[Status] AS [Status], row_number() OVER (ORDER BY [Extent1].[Id] DESC) AS [row_number]FROM [dbo].[CT_Article] AS [Extent1])  AS [Extent1]WHERE [Extent1].[row_number] > 0ORDER BY [Extent1].[Id] DESC

转载于:https://www.cnblogs.com/bwangel/p/mvcpager2.html

在 asp.net mvc中的简单分页算法 (续)相关推荐

  1. ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)

    AJAX的好处就是不会堵塞页面,可以提高用户体验,可以减少数据传输尺寸,提高应用程序的性能.目前,AJAX技术可以说是已经成为WEB开发的标准技术. AJAX技术是纯客户端技术,任何客户端框架(如:M ...

  2. 通过源代码研究ASP.NET MVC中的Controller和View(二)

    通过源代码研究ASP.NET MVC中的Controller和View(一) 在开始之前,先来温习下上一篇文章中的结论(推论): IView是所有HTML视图的抽象 ActionResult是Cont ...

  3. ASP.NET MVC中你必须知道的13个扩展点

         ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我 ...

  4. 在ASP.NET MVC中使用IIS级别的URL Rewrite

    在ASP.NET MVC中使用IIS级别的URL Rewrite 原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的 ...

  5. ASP.NET MVC中实现多个按钮提交的几种方法

    有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...

  6. Asp.Net MVC中的RenderPartial 和 RenderAction 【转】

    在Asp.Net MVC中要实现某个功能可以通过许多种方式,今天我们就来讨论下使用RenderPartial和RenderAction在视图中呈现部分内容之间的区别. 比如我们要呈现如下的图所示的内容 ...

  7. 在ASP.NET MVC 中获取当前URL、controller、action

    在ASP.NET MVC 中获取当前URL.controller.action URL的获取很简单,ASP.NET通用: [1]获取 完整url  (协议名+域名+虚拟目录名+文件名+参数) stri ...

  8. Hangfire在ASP.NET CORE中的简单实现

    hangfire是执行后台任务的利器,具体请看官网介绍:https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNe ...

  9. 如何在 ASP.NET MVC 中集成 AngularJS(3)

    今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...

最新文章

  1. nginx负载均衡策略upstream
  2. 为无LIB的DLL制作LIB函数符号输入库zz
  3. Windows——蓝屏[失败的操作:HardwareProtect_x64.sys]解决方案
  4. 解决ntfs格式的移动硬盘mount到Linux下时变成只读文件系统的问题
  5. mysql 5.7 my.cnf 为空_mysql 5.7 的 /etc/my.cnf
  6. 最全面试考点与面试技巧,真香!
  7. LeetCode 646. Maximum Length of Pair Chain
  8. Linux shell笔记5 基本文本处理
  9. c语言中未声明的标识符要怎么办,vc ++未声明的标识符,虽然它已声明
  10. IIS(IISReset.exe)命令行(备忘)
  11. WPF-创建超链接文本
  12. 郑州双轨制直销系统开发奖金制度介绍
  13. linux win10 mac地址修改,两种方法教你修改Win10专业版MAC物理地址
  14. win10 Linux双系统教程,win10+ubuntu双系统超详细教程(亲测可用)
  15. 苹果app退款_app退款不成功原因有三
  16. 微软官方外挂,让你的win10更加好用
  17. CAPICAPICOM的一些知识[转]
  18. Swift - 描边文字效果
  19. buuctf————findkey
  20. 个人理财有哪些基本原理和方法?——知乎李东旭

热门文章

  1. 外贸常用术语_外贸干货!做外贸常用的贸易术语,几个妙招教你快速记住!
  2. html5制作语音交互功能,语音交互设计(1):设计流程
  3. Leetcode-260. 只出现一次的数字 III
  4. jqGrid文字根据表格大小自动换行
  5. 笔记-项目范围管理-项目范围说明书
  6. 笔记-信息化与系统集成技术-供应链管理
  7. Mysql悲观锁乐观锁区别使用区别
  8. Windows下使用Java API操作HDFS的常用方法
  9. Anuglar中的常用通道-大小写转换、日期转换、小数位数、Json、slice、管道链
  10. Winforn中怎样在窗体中打开另一个窗体