(转)动态Entity Framework查询:Dynamic Query 介绍

原文地址:http://www.cnblogs.com/yinzixin/archive/2012/11/30/entity-framework-dynamic-query.html

Dynamic Query是一个支持动态Entity Framework查询的库。它的设计初衷是为了减少在管理系统中大量出现的对一个数据集进行查找、排序、分页的这类场景的开发工作量,其设计思想是”markup is code ”。通过在View上编写具有语义信息的标签,来实现这类常见的功能需求,而不再需要额外的代码。它不是一个完整的ORM,是基于Entity Framework的,因此开发者仍然可以利用Entity Framework提供的大量特性,和现有的EF项目保持兼容。

Dynamic Query分为两个部分,其中之一是一个查询接口,这是一个IQueryable<T>的扩展方法:

public static IQueryable<T> Query<T>(this IQueryable<T> data, QueryDescriptor descriptor)

 

其中QueryDescriptor是一个简单的类,包含了一个查询的必要信息,例如,筛选条件,排序信息,分页信息等。

例如:

QueryDescriptor descriptor = new QueryDescriptor{OrderBy = new OrderByClause { Key = "Price", Order = OrderSequence.ASC },PageSize = 3,PageIndex = 1,Conditions=new QueryCondition[] {new QueryCondition { Key = "Name",Value = "Rice", Operator = QueryOperator.CONTAINS }}};int pageCount;var res=ctx.Products.Query(descriptor, out pageCount);

这相当于执行了查询:

select * from Product where [Name] like N'%Rice%' order by Price asc

并且对结果进行分页,每页3条数据,返回第一页。注意,这里返回的结果是IQueryable<T>,这实际上是一个Entity Framework的查询,在没有序列化之前,并没有对数据库进行操作,分页也是发生在服务器端的,这对于大数据来说能够极大的减少网络传输和内存使用量。 当然,手动构造这样一个QueryDescriptor也是一件非常无趣的事情,为此Dynamic Query还为asp.net MVC 实现了一系列的helper方法和一个model binder,来自动生成QueryDescriptor。我们最终的目标是获得页面提交的数据,自动生成QueryDescriptor对象。为此,需要注册一下一个自定义的binder,只需要在Global.asax的Application_Start中添加一行代码:

ModelBinders.Binders.Add(typeof(QueryDescriptor), new QueryDescriptorBinder());

 

假如我们有如下的EF模型:

image

我们来实现一个列表,对Product的Name进行筛选。这时候,可以使用QueryTextbox扩展方法来生成查询字段,View的代码如下:

<div class="container">    <form class=".form-search">@Html.QueryTextbox("Name", "Product Name", QueryOperator.CONTAINS)
<input type="submit" value="Search" class="btn"/></form>    
</div>
<div class="row"><div class="span12 offset2   "><table class="table table-striped"><thead><tr><td>ID</td><td>Category</td><td>Name</td><td>Price</td><td>Description</td></tr></thead><tbody>@foreach (var p in @Model){<tr><td>@p.Id</td><td>@p.Category.Name</td><td>@p.Name</td><td>@p.Price</td><td>@p.Description</td></tr>}</tbody></table></div>
</div>

 

上半部分是一个form,里面有一个QueryTextBox,下半部分就是一个列表,非常简单。看对应的Action:

public ActionResult Index(QueryDescriptor descriptor){ShopContainer ctx = new ShopContainer();var result = ctx.Products.Query(descriptor);return View("Product",result);}

由于Model Binder的存在,Action会从页面获得QueryDescriptor的信息。这样一个筛选页面就做好了。如果客户说,我还要增加对种类名称和价格范围的筛选,那需要改什么地方?只需要在View的form中添加几个QueryTextbox就可以了

<form class=".form-search">@Html.QueryTextbox("Name", "Product Name", QueryOperator.CONTAINS)@Html.QueryTextbox("Category.Name", "Product Category", QueryOperator.CONTAINS)@Html.QueryTextbox("Price.1", "Price Between", QueryOperator.GREATEROREQUAL,"decimal")@Html.QueryTextbox("Price.2", "", QueryOperator.LESSOREQUAL,"decimal")<input type="submit" value="Search" class="btn"/></form>  

注意,Price出现了两次,需要加上数字后缀区分一下就可以,如果不是string类型,加上类型的说明,这样就OK。Action方法是不需要有任何改动的。

如果客户说这个要分页怎么办? 分页需要稍微多些两行代码,但是也只需要2分钟就足够,先看Action方法:

public ActionResult Product(QueryDescriptor descriptor){descriptor.PageSize = 5;descriptor.OrderBy = new OrderByClause { Key = "Id", Order = OrderSequence.ASC };ShopContainer ctx = new ShopContainer();int pageCount;var result = ctx.Products.Query(descriptor, out pageCount);Pager pager = new Pager(pageCount, descriptor);ViewBag.Pager = pager;return View("Index",result);}

首先指定一页显示的数量,因为要分页,必须要有排序信息,这里是根据Id,升序排列。接下来还是调用Query方法获得数据,注意,这里是Query的一个重载的方法,能够返回总共有多少页,这一般是分页控件需要的信息。接下来实例化一个Pager对象,这个Pager是一个分页器,包含在Dynamic Query中,如果你想用其他第三方的分页器,也是可以的。Pager需要的额外信息就是总页数,把这个Pager放到ViewBag上面,然后Action的工作就完成了。View上面也不想要任何改变,如果你想加上分页链接的话,只需要一行代码:

@Html.QueryPager((Pager)ViewBag.Pager); 

看看效果:

image

 

项目主页和源代码在:http://dynamicquery.codeplex.com/  上面有一个样例程序,更多文档在完善中。

这个项目才开始没多久,还有很多细节需要完善,主要是样式、支持更多的控件,比如checkbox,dropdownlist等。以后慢慢补充。

转载于:https://www.cnblogs.com/fcsh820/archive/2012/12/06/2804595.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++远征之继承篇——多重继承,多继承,虚继承,多继承时的重复定义解决方法

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、多重继承 &#xff08;1&#xff09;概念理解 2、多继承 &#xff08;1&#xff09;概念理解 3、虚继承 &#xff08;1&#xff09;问题的引出&#xff1a;多重继承和多继承的结合&#xff0c…

从Pycharm说起

说实话.作为一个Coder.每天在各种IDE中切换编写Code.如果一个IDE Look and Feel总是无形中影响你每天Code Farm的心情.那该是多么不爽的事情.特别是针对本人对IDE总是有一种天生“洁癖感”.每当一们语言或技术在无意中吸引我.或是已经在粗糙的本文编辑器初体验.都会在两到三天体…

JAVA开发工具下载

一、eclipse下载 下载地址&#xff1a;http://www.eclipse.org/downloads/packages/ 点击下载 弹出下载框 压缩包解压后就可以使用 转载于:https://www.cnblogs.com/djlsunshine/p/11373287.html

c++远征之多态篇——虚函数及其实现原理

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、多态的定义 简单理解&#xff0c;就是对于同一条命令&#xff0c;不同对象会做出不同的操作。相同对象收到不同消息&#xff0c;或者不同对象收到相同消息时&#xff0c;产生不同的动作。 2、多态…

c++远征之多态篇——纯虚函数和抽象类、接口类

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、纯虚函数 没有函数体&#xff1b;0&#xff1b;即只有函数声明&#xff0c;而没有函数定义的虚函数&#xff0c;是纯虚函数。 2、抽象类 概念&#xff1a;含有纯虚函数的类&#xff0c;叫抽象类…

W3 Total Cache+Hacklog Remote Attachment Upyun

2019独角兽企业重金招聘Python工程师标准>>> Hacklog Remote Attachment Upyun 是「荒野无灯」开发的WP插件&#xff0c;可以很方便的配合又拍云使用。通过这个插件&#xff0c;可以在添加媒体的时候上传至又拍云&#xff0c;对速度有极大的提升。 另外&#xff0c;…

VS2013崩溃,无法打开项目的解决方案

最近遇到VS2013&#xff0c;在打开解决方案时&#xff0c;报如下错误&#xff1a; “未找到与约束 ContractName Microsoft.Internal.VisualStudio.PlatformUI.ISolutionAttachedCollectionServiceRequiredTypeIdentity Microsoft.Internal.VisualStudio.PlatformUI.ISolutionA…

c++远征之多态篇——运行时类型识别(RTTI)

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、RTTI&#xff08;Run-Time Type Information&#xff09;&#xff0c;运行时类型识别。 涉及typeid、dynamic_cast这两个知识点。RTTI技术可以通过父类指针&#xff0c;识别其所指向对象的真实数…

用c#写的一个局域网聊天客户端 类似小飞鸽

最后在公司实习&#xff0c;新人不给活干&#xff0c;就自己随便看看&#xff0c;了解一些DevExpress控件啊&#xff0c;编码规范啊之类的&#xff0c;自己就寻思着写一点点小东西练习练习 出于自己对c# socket这块不熟&#xff0c;就选择了这块&#xff0c;顺便可以进一步了解…

c++远征之多态篇——异常处理

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、关于异常的一些概念 异常&#xff1a;程序运行期出现的错误。 数组下标越界&#xff1b;除数为0&#xff1b;内存不足&#xff1b;…… 异常处理&#xff1a;对有可能发生异常的地方做出预见性的…

图像传感器之CMOS(2)

转&#xff1a;http://www.elecfans.com/application/Military_avionics/2013/0531/319531.html 提高宇航级图像传感器生产能力 日前&#xff0c;在能量效率方面不断创新的安森美半导体公司已同斯坦福国际研究院&#xff08;SRI&#xff09;和波尔航天科技公司合作&#xff0c;…

c++远征之模板篇——友元函数、友元类

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 一、友元函数 1、分类 全局函数——》友元全局函数 成员函数——》友元成员函数 2、关键字friend 友元全局函数 如下&#xff0c;利用friend修饰的函数&#xff0c;其参数应该是本类的引用或者指…

PHP通过session判断防止表单重复提交实例

PHP通过session判断防止表单重复提交实例 PHP通过session判断防止表单重复提交实例&#xff0c;当用户提交表单后&#xff0c;为防止重复操作&#xff0c;通过session来判断是否为初次提交&#xff0c;否则让他返回到之前表单页面。 当前表单页面is_submit设为0 1 SESSION_STAR…

c++远征之模板篇——静态数据成员,静态成员函数

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、静态数据成员 &#xff08;1&#xff09;不同于普通的数据成员&#xff0c;静态数据成员在没有实例化时&#xff0c;它也是存在的&#xff08;即它是和类共存的&#xff09;&#xff1b; &…

c++远征之模板篇——运算符重载

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 一、运算符重载的概念 给原有的运算符赋予新的功能。比如下面的截图&#xff0c;本来加号并不具备坐标的相加的功能&#xff0c;但是通过运算符重载可以实现该功能。 二、运算符重载的本质 本质是…

frp对http协议应用

前言 frp是一个开源的项目, 可用于内网穿透的高性能的反向代理应用&#xff0c;支持 tcp, udp 协议&#xff0c;为 http 和 https 应用协议提供了额外的能力&#xff0c;且尝试性支持了点对点穿透。 github地址&#xff1a;https://github.com/fatedier/frp 此处对http的应用做…

树形列(无限级联下拉列的曲线版本)

先上效果图&#xff1a; 1、列表 - 列表设置 - 创建栏&#xff0c;“类型”选择“托管元数据”&#xff0c;如下图&#xff1a; 2、选中“托管元数据”后&#xff0c;可以到下面编辑需要的树形啦&#xff1a; 3、编辑好&#xff0c;确定&#xff0c;搞定&#xff1b;可以到列表…

c++远征之模板篇——函数模板、类模板

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 函数模板&#xff08;vs模板函数&#xff09; 1、为什么需要模板&#xff1f; 函数体相同&#xff0c;只是类型不一样而已。那么能否把数据的类型当做参数传递呢&#xff1f;肯定是可以的&#xff0…

c++远征之模板篇——标准模板库(STL)

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 常见的设计模板 1、vector&#xff0c;向量 &#xff08;1&#xff09;本质是对数组的封装&#xff1b; &#xff08;2&#xff09;能够在常数时间内完成读取&#xff1b; &#xff08;3&#xf…

数据结构探险——队列篇

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、什么是队列&#xff1f; &#xff08;1&#xff09;先入先出的模型&#xff08;FIFO&#xff09;。 &#xff08;2&#xff09;队头&#xff0c;队尾。 &#xff08;3&#xff09;细分为普通队…