(转)动态多条件查询分页以及排序(一)--MVC与Entity Framework版url分页版
2012-12-06 10:57
696 查看
原文地址:http://www.cnblogs.com/wlflovenet/archive/2012/12/04/MVC_EntityFramework_Query.html
一.前言
多条件查询分页以及排序 每个系统里都会有这个的代码 做好这块 可以大大提高开发效率 所以博主分享下自己的6个版本的 多条件查询分页以及排序
二.目前状况
不论是ado.net 还是EF 在做多条件搜索时 都有这类似的代码
View Code
通过上面的代码 就可以保存住以前的参数了 接着就是
这样就可以设置分页 以及解耦控制器 和方法名了~
如果你设置了类似的路由
那么也是支持的~
2.技巧二
因为我们的分页 支持通过下拉框选择页码后自动跳页 有点儿像webform 的autopostback 而我们又是get 提交版的 需要解决一个问题 选择后自动跳页 需要带上以前的查询条件 不能跳完页以后 查询条件消失了
这里采用的办法 借鉴了一下 aspnetpager 作者的 urlpager的思路
用一个隐藏的a 标签 这个a 标签生成的连接 保存了当前的查询条件等 他的页面数 显示成"*pageindex* 当我们选择下拉框跳页后 用选择的值 替换这个"*pageindex* 然后跳转到当前href 则解决了上述问题
上代码
3.点击搜索时 get 提交 并回到第一页
具体代码可以下载源码看~
七. URL GET提交的遗憾
上面基本功能已经实现 但是有些遗憾的是 大家知道 mvc没有viewstate机制 而且我们的又是URL分页 及时是webform 也会面临这个问题
虽然我们通过url保存了搜索的状态 但是没有解决点击分页后 搜索框的内容还在。所以会出来一个奇怪的现象 按条件搜索完 比如搜索姓名为hy的 然后点击分页 搜索框的内容没了
但是分页后内容却还是hy的 因为我们的url 里存的有搜索结果 但是重新加载后 文本框的内容却没了 这样虽然无伤大雅 但是还是略感不爽 如果非要解决 也不是没有办法 只是觉得都不是很完美
方案1.
因为我们的url里保存的有真实的搜索条件 所以我们可以通过Request.QueryString["[Contains]StuId"] 直接得到 但是我觉得在MVC里 出现Request.QueryString 这样的信息 不好看
方案2.
ViewContext.Controller.ValueProvider.GetValue("[Contains]StuId").RawValue 通过这样 也可以得到值
方案3.
在控制器里
ViewBag.Query = querymodel; 记录搜索条件 然后在view里读出来
上面三个方式 感觉都有不完美的地方 因为我们还原的内容 不只是 text 有可能是 多选框 下拉列表 等 所以要做处理 就稍微麻烦了下 比如
我再想 把这些还原也做成自动化的 不用任何代码的 求集思广益 希望大家给些建议
八.总结
EF实现动态查询以及排序的关键 就在于表达式树的构建。所以学会并理解表达式树很关键,这个不尽在这里有用,用来代替反射也可以提高效率~不过表达式树的生成 建议实际项目中 加上缓存。
表达式树的学习 可以看下这几篇
http://www.cnblogs.com/Terrylee/archive/2008/08/01/custom-linq-provider-part-1-expression-tree.html
/article/4797504.html
http://msdn.microsoft.com/en-us/library/bb397951.aspx
短短文章 花了半天才写完~ 希望对大家有帮助 或者能给大家一些启示 有问题可以留言交流 欢迎批评和建议 感谢阅读~
顺便帮忙宣传下 我在的两个QQ群吧 33353329 205217091 有兴趣的可以进来讨论
过几天介绍另两个版本 POST提交版和 MVC+EF AJAX 多条件查询 分页 排序
最后附上本节代码下载 (代码比较粗糙,主要做演示)
转载请说明来自 http://www.cnblogs.com/wlflovenet/archive/2012/11/30/MVC_EntityFramework_Query.html
一.前言
多条件查询分页以及排序 每个系统里都会有这个的代码 做好这块 可以大大提高开发效率 所以博主分享下自己的6个版本的 多条件查询分页以及排序
二.目前状况
不论是ado.net 还是EF 在做多条件搜索时 都有这类似的代码
View Code
通过上面的代码 就可以保存住以前的参数了 接着就是
dict["PageIndex"] = 1;//设置页码 @Html.RouteLink("首页", dict);
这样就可以设置分页 以及解耦控制器 和方法名了~
如果你设置了类似的路由
routes.MapRoute("Page", "{controller}/{action}/page{PageIndex}", new { controller = "WLFQuery", action = "Index", PageIndex = 1 });
那么也是支持的~
2.技巧二
因为我们的分页 支持通过下拉框选择页码后自动跳页 有点儿像webform 的autopostback 而我们又是get 提交版的 需要解决一个问题 选择后自动跳页 需要带上以前的查询条件 不能跳完页以后 查询条件消失了
这里采用的办法 借鉴了一下 aspnetpager 作者的 urlpager的思路
用一个隐藏的a 标签 这个a 标签生成的连接 保存了当前的查询条件等 他的页面数 显示成"*pageindex* 当我们选择下拉框跳页后 用选择的值 替换这个"*pageindex* 然后跳转到当前href 则解决了上述问题
上代码
<text>跳转至</text> <select id="pageselect" onchange="selectchange()"> @for (int i = 1; i <=@Model.TotalPageCount; i++) { var selected = ""; if (i==Model.CurrentPageIndex) { selected = "selected='selected'"; } <option value="@i" @selected>@i</option> } </select> { dict["PageIndex"] = "*pageindex*"; } <a style="display:none" id="pagelink" href="@Url.RouteUrl(dict)" ></a> // <script type="text/javascript"> function selectchange() { var pageselect = document.getElementById("pageselect"); var pageselectValue = pageselect.options[pageselect.selectedIndex].value; var linkdom= document.getElementById("pagelink"); var href = linkdom.href; href = href.replace("*pageindex*", pageselectValue); window.location = href; } </script> <text>页</text>
3.点击搜索时 get 提交 并回到第一页
<form action="@Url.Action("index", new { PageIndex = 1 })" method="get"> </form>
具体代码可以下载源码看~
七. URL GET提交的遗憾
上面基本功能已经实现 但是有些遗憾的是 大家知道 mvc没有viewstate机制 而且我们的又是URL分页 及时是webform 也会面临这个问题
虽然我们通过url保存了搜索的状态 但是没有解决点击分页后 搜索框的内容还在。所以会出来一个奇怪的现象 按条件搜索完 比如搜索姓名为hy的 然后点击分页 搜索框的内容没了
但是分页后内容却还是hy的 因为我们的url 里存的有搜索结果 但是重新加载后 文本框的内容却没了 这样虽然无伤大雅 但是还是略感不爽 如果非要解决 也不是没有办法 只是觉得都不是很完美
方案1.
ID(like操作): <input type="text" name="[Contains]StuId" value="@Request.QueryString["[Contains]StuId"]" /><br />
因为我们的url里保存的有真实的搜索条件 所以我们可以通过Request.QueryString["[Contains]StuId"] 直接得到 但是我觉得在MVC里 出现Request.QueryString 这样的信息 不好看
方案2.
ViewContext.Controller.ValueProvider.GetValue("[Contains]StuId").RawValue 通过这样 也可以得到值
方案3.
在控制器里
ViewBag.Query = querymodel; 记录搜索条件 然后在view里读出来
QueryModel query=ViewBag.Query as QueryModel; string StuId=query.Items.Where(x => x.Field == "StuId").Select(x=>x.Value).FirstOrDefault()!=null?query.Items.Where(x => x.Field == "StuId").Select(x=>x.Value).FirstOrDefault().ToString():"";
上面三个方式 感觉都有不完美的地方 因为我们还原的内容 不只是 text 有可能是 多选框 下拉列表 等 所以要做处理 就稍微麻烦了下 比如
string[] newarrlovewgril = (string[])arrlovegril; MMischeck= newarrlovewgril.Contains("MM") ? "checked='checked'" : ""; LUCIischeck = newarrlovewgril.Contains("LILI") ? "checked='checked'" : ""; GAGAischeck = newarrlovewgril.Contains("GAGA") ? "checked='checked'" : ""; MM<input type="checkbox" name="lovegril" value="MM" @MMischeck /> LILI<input type="checkbox" name="lovegril" value="LILI" @LUCIischeck /> GAGA<input type="checkbox" name="lovegril" value="GAGA" @GAGAischeck />
我再想 把这些还原也做成自动化的 不用任何代码的 求集思广益 希望大家给些建议
八.总结
EF实现动态查询以及排序的关键 就在于表达式树的构建。所以学会并理解表达式树很关键,这个不尽在这里有用,用来代替反射也可以提高效率~不过表达式树的生成 建议实际项目中 加上缓存。
表达式树的学习 可以看下这几篇
http://www.cnblogs.com/Terrylee/archive/2008/08/01/custom-linq-provider-part-1-expression-tree.html
/article/4797504.html
http://msdn.microsoft.com/en-us/library/bb397951.aspx
短短文章 花了半天才写完~ 希望对大家有帮助 或者能给大家一些启示 有问题可以留言交流 欢迎批评和建议 感谢阅读~
顺便帮忙宣传下 我在的两个QQ群吧 33353329 205217091 有兴趣的可以进来讨论
过几天介绍另两个版本 POST提交版和 MVC+EF AJAX 多条件查询 分页 排序
最后附上本节代码下载 (代码比较粗糙,主要做演示)
转载请说明来自 http://www.cnblogs.com/wlflovenet/archive/2012/11/30/MVC_EntityFramework_Query.html
相关文章推荐
- 动态多条件查询分页以及排序(一)--MVC与Entity Framework版url分页版
- 动态多条件查询分页以及排序(一)--MVC与Entity Framework版url分页版
- 动态多条件查询分页以及排序(一)--MVC与Entity Framework版url分页版
- MVC 列表多条件动态查询分页
- SqlServer分页存储过程(多表查询,多条件排序),Repeater控件呈现数据以及分页
- 动态查询条件,分页存储,正反向排序(亲身体验)
- Entity Framework4.1实现动态多条件查询、分页和排序
- Entity Framework4.1实现动态多条件查询、分页和排序
- 使用MVC,实现多条件查询,排序与分页 的 存储过程
- LINQ自定义真分页(尚未添加多字段动态查询与多字段排序)
- easyUi分页以及条件查询
- Thymeleaf+spring jpa+springmvc实现的增删改查以及分页查询
- 07--MySQL自学教程:DQL(Data Query Language:数据库查询语言)简介、基础查询、条件查询、模糊查询以及排序(一)
- Springboot整合JPA以及动态条件查询的实现
- C# MongoDB 查询,分组,聚合,排序,条件,分页
- springmvc + jquery datatable + ajax实现动态分页查询
- Mongodb 3.2 Java 显示指定字段 条件查询 分页排序
- 动态SQL中 实现条件参数 varchar类型的参数名称 以及模糊查询实现
- C# MongoDB 查询,分组,聚合,排序,条件,分页
- 使用该JavaBean可以将数据在JSP页面中以表格的形式显示出来,并具有动态排序、动态生成查询、自动分页功能