动态多条件查询分页以及排序MVC与EntityFramework版url分页版

上传人:ji****72 文档编号:39579952 上传时间:2018-05-17 格式:DOC 页数:148 大小:2.71MB
返回 下载 相关 举报
动态多条件查询分页以及排序MVC与EntityFramework版url分页版_第1页
第1页 / 共148页
动态多条件查询分页以及排序MVC与EntityFramework版url分页版_第2页
第2页 / 共148页
动态多条件查询分页以及排序MVC与EntityFramework版url分页版_第3页
第3页 / 共148页
动态多条件查询分页以及排序MVC与EntityFramework版url分页版_第4页
第4页 / 共148页
动态多条件查询分页以及排序MVC与EntityFramework版url分页版_第5页
第5页 / 共148页
点击查看更多>>
资源描述

《动态多条件查询分页以及排序MVC与EntityFramework版url分页版》由会员分享,可在线阅读,更多相关《动态多条件查询分页以及排序MVC与EntityFramework版url分页版(148页珍藏版)》请在金锄头文库上搜索。

1、博客园_您正在查看的源包含频繁更新的内容。您正在查看的源包含频繁更新的内容。订阅源后,该源会添加到“常见源列表” 中。该源的更新信息会自动下载到计算机,通过 Internet Explorer 及其他程 序可以查看这些信息。进一步了解源。订阅该源动态多条件查询分页以及排序动态多条件查询分页以及排序( (一一)-MVC)-MVC 与与 EntityEntity FrameworkFramework 版版 urlurl 分页版分页版2012年12月4日,8:46:00 | wlf一一. .前言前言多条件查询分页以及排序 每个系统里都会有这个的代码 做好这块 可以大大提高开发效率 所以博主分享下自己

2、的 6 个版本的 多条件查询分页以及排序二二. .目前状况目前状况 不论是 还是 EF 在做多条件搜索时 都有这类似的代码这样有几个不好的地方1.当增加查询条件,需要改代码,对应去写相应的代码。2.对多表查询以及 or 的支持 不是很好。而我们很常见的需求不可能是一个表 的查询3. 这样写表示层直接出现 了 SQL 语句 或者 linq 的拉姆达表达式 这是很不 好的 表示层不应该知道数据访问技术4.有的时候 我们的业务逻辑层接口是这样的 IList seach(string name,string age,string classname,int pageindex,int pagesiz

3、e,string oderby)这个时候 多一个查询条件 对应的还要去修改业务逻辑层 EF 由于传递的是表 达式树,则更是苦不堪言.三三. .我们接下来应该实现的目标我们接下来应该实现的目标1.当增加条件时 不需要修改代码 只需要在 view 上 增加相应的查询框即可2.我们的多条件查询 应该做到无关表示层技术(是否是 MVC 或 webform) 3.应该支持多表查询 以及 OR 的操作 4.应该支持更多的查询 like in 不等于 等操作5.关于分页 不应该与数据访问耦合在一起 个人感觉 分页只需要知道总条数 以及当前页数 和每页多少条 然后生成分页代码即可 不应该与 EF 等耦合到一

4、起 分页应该是独立出来 可控制的6.客户可以自己添加搜索条件 这是个强大的功能 想怎么查 客户自己添加即可 7. 统一查询接口 做到有条件增加 不修改代码8.分页应该支持 url 重写或者 mvc 路由 不应该生成的连接只是?pageindex=值 这种的四四. .我实现的几个多条件查询分页版本以适应各种需我实现的几个多条件查询分页版本以适应各种需求求( (每篇会写一个版本的实现以及代码的提供每篇会写一个版本的实现以及代码的提供, ,有好意有好意见的欢迎留言见的欢迎留言) )1.url get 提交版 实现 URL 分页多条件查询以及排序的好处是 我们可以把当 前的搜索条件 当前页数 排序等

5、都在 url 上显示 可以方便的发给好友 以及后 退等浏览器操作(个人给 dudu 老大建议,博客园应该做成这种的)2.post 提交版本的 搜索条件较大 不适合用 url 的 3.ajax+mvc 版本的 (关于 AJAX 实现 我认为有两种 1.服务端实现好内容的拼 接,传输给客户端 2 直接传递 json 给客户端 客户端来做拼接)这个版本会实现服务端拼接内容 好处是 服务端做拼接简单 能做更多的事情 维护服务端代码方便 尤其是强大的 Razor4.ajax+webapi+Knockoutjs 版本这个版本 我实现的是 服务端只是传递 json 这样服务端效率很高 喜欢这样开 发方式的朋

6、友 就是前端拼接字符是很不好的 代码会显得很乱 这个时候 前端 就需要一个模版引擎我用的是 jquery-temp 配合强大的 Knockoutjs5.动态增加查询条件版这个版本我实现的是 客户可以自己添加查询条件 查询条件是动态的6.移植到 webform 版7.EF 应该得到表达式树 让 EF 自己生成 SQL 语句 这样方便扩展 实现其他方法五五.url.url getget 提交版开始提交版开始废话了那么多 今天就写下 url get 版的多条件查询 以及分页 排序先上个丑陋界面的截图 界面虽丑 但是功能齐全 查询 分页 排序齐全看下控制器的代码我们这里没有各种条件判断 判断哪个为空

7、使用哪个排序的判断 我们的业务逻 辑层接口 没有接受表达式树的参数 与数据访问层不是耦合的 而是使用了 Querymodel 对象 来抽象所有查询条件这样 这个对象 可以翻译成 EF 的表达式树 也可以翻译成 SQL 语句 所以我们 的 表示层 MVC 不用非要使用 EF 的的底层而我们的分页 只需要知道当前页数 总数据 以及 每页大小 去自动生成分页关于分页 很多人喜欢把这个扩展 htmlhelper 做成 html.pager 这种做法 这 样很多表示层的展示 都会耦合到 这个里面 举个例子,比如把分页的布局 从 table 变成 ul 这样的 这是纯表示层的本应该修改 view 现在却要

8、去改 htmlhelper 而且你的分页代码越强大 则 htmlhelper 里的内容越多 修改起来越不容易 所以我的意见是 做分页的 最好 使用 html.Partial 然后把分页的逻辑写到部分页里 这样就实现了分页 只关注分页 与其他的一切都没有关系 我们要做 的就是构建 Pager 类 然后传递给模版即可 例如这个版本要注意的就是 分页后要保存查询条件六.urlurl getget 提交版实现分析提交版实现分析1.先来说下多条件查询吧 我们要做的是把各个条件构建成 QueryModel 而如何构建则是关键 我们想下 获得 mvc 提交的内容的是根据 name 所以我们可以固定一个 na

9、me 的格式 如ID(like 操作): 这样我们可以通过正则获取想要信息的部分 然后在模型绑定构建出 QueryModel 对象 然后再把这个对象 翻译成 SQL 语句 或者表达式树 就可以用于 ado 或者 EF 操作了顺便重点说下 这个思路 园子里的重典早都实现了 而且实现的很好 大家可以去他的博客看下 以后的各个版本的分页 都会用这个表达式树构建为基础 这是他文章的链接 重典老哥的实现(ps:这周刚刚见过他本人,聊得甚欢,开心.希望以后还可以多聚聚)不过重典老哥的表达式树构建 我改成自己的实现了 整体思路还是一样的 自恋的说下 我的可读性更高些 哈哈 因为重典已经描述的很详细了 具体可

10、以看我的代码和他的文章当然我们得到 通过 QueryModel 得到的表达式树 通过扩展方法 直接调用 Where 方法即可 让我们看下我们的 EF 的业务逻辑层public class StudentService:IStudentService/ / 按条件搜索/ / 搜索条件/ 当前页数(索引从 1 开始)/ 每页显示条数/ 总条数/ 排序字段/ 是否升序/ public IList Search(QueryModel query, int pageIndex, int pageSize, out int total, string orderBy, bool ascending)ILi

11、st stulist = Builder.CreateListOfSize(321).TheFirst(44).With(x = x.StuName = “hy“).And(x = x.Nullint = 1).And(x = x.LoveGril = “LILI“).And(x = x.CreateTime = new DateTime(2012, 02, 03).And(x = x.Birthday = new DateTime(2012, 09, 01).And(x = x.Stuclass = new StuClass() ClassId = “2“, ClassName = “二班“

12、 ).TheNext(33).With(x = x.StuName = “wlf“).And(x = x.Nullint = 2).And(x = x.LoveGril = “MM“).And(x = x.CreateTime = new DateTime(2012, 06, 06).And(x = x.Birthday = new DateTime(2012, 09, 010).And(x = x.Stuclass = new StuClass() ClassId = “1“, ClassName = “一班“ ).TheNext(244). And(x=x.Stuclass=new Stu

13、Class()ClassId = “3“, ClassName = “ 三班“).Build();var dbcontext = stulist.AsQueryable(); /模拟 EF context 假设数据库里原数据为 200 条 dbcontext = dbcontext.Where(query);total = dbcontext.Count();/执行查询数量 sqldbcontext = dbcontext.OrderBy(orderBy, ascending).Skip(pageSize * (pageIndex - 1).Take(pageSize);return dbco

14、ntext.ToList();/执行分页排序查询 sql这里说下 为了大家调试方便 不用真正的数据库 用了测试神奇 NBuilder 来模 拟的 然后转换成 AsQueryable 来模拟 EF 的看上面代码 可以看到 没有了各个分支的条件判断 以及排序的判断 以后多出 查询条件 不需要修改业务逻辑层了2.接下来说下接下来说下 urlurl getget 提交的思路提交的思路上问说过自己的观点 分页最好能放到部分页 而不是扩展 htmlhelper 所以我 的实现方式是把构建 Pager 分页视图类 传递给 部分视图 来做如何展示 一些 分页有关的逻辑封装在 Pager 里下面是 Pager

15、的代码public class Pagerpublic Pager(int currentPageIndex, int totalItemCount, int pagesize = 20)this.TotalItemCount = totalItemCount;this.PageSize = pagesize;this.CurrentPageIndex = currentPageIndex TotalPageCount ? 1 : currentPageIndex;/ / 当前第几页/ public int CurrentPageIndex get; set; / / 每页显示多少条/ pub

16、lic int PageSize get; set; / / 总共多少条记录/ public int TotalItemCount get; set; / / 总共多少页/ public int TotalPageCountgetdouble pageCount = (double)TotalItemCount / (double)PageSize;pageCount = Math.Ceiling(pageCount);return (int)pageCount;/ / 是否显示/ public bool IsShowgetif (TotalPageCount 0)return true;elsereturn false;/ / 是否显示上一页/ public boo

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号