原文地址: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模型:

我们来实现一个列表,对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); 

看看效果:

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

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

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

(转)动态Entity Framework查询:Dynamic Query 介绍相关推荐

  1. 1.18.5.流式概念、动态表(Dynamic Table)、DataStream上的关系查询、动态表 连续查询(Continuous Query)、在流上定义表、处理时间

    1.18.5.流式概念 1.18.5.1.动态表(Dynamic Table) 1.18.5.1.1.DataStream上的关系查询 1.18.5.1.2.动态表 & 连续查询(Contin ...

  2. 第三篇 Entity Framework Plus 之 Query Cache

    离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...

  3. 第二篇 Entity Framework Plus 之 Query Future

    从性能的角度出发,能够减少 增,删,改,查,跟数据库打交道次数,肯定是对性能会有所提升的(这里单纯是数据库部分). 今天主要怎样减少Entity Framework查询跟数据库打交道的次数,来提高查询 ...

  4. Entity Framework查询,EF执行SQl

    一.简介 EF 支持开放底层的 ADO.NET 框架,DbContext有三种常用方法 DbSet.SqlQuery //查询并返回Entities DbContext.Database.SqlQue ...

  5. Entity Framework Core 之简单介绍

    Overview EFCore是一个以对象映射器(O/RM)为核心的轻量级.可扩展的实体框架数据访问技术,目前支持Microsoft SQL Server.SQLite.Postgres(Npgsql ...

  6. 【查询】—Entity Framework实例详解

    Entity Framework 查询使用集成查询,简称LINQ.LINQ是一个查询框架,并不限于Entity Framework使用,同样不限于数据库.LINQ Provider 负责将LINQ查询 ...

  7. LINQ TO SQL和Entity Framework 的关系 你了解多少?

    1. LINQ  TO SQL 和EF 特点:  LINQ TO SQL和Entity Framework都是一种包含LINQ功能的ORM 也就是所谓的关系对象的映射.其中包括的有DBFrist  C ...

  8. Entity Framework 实体框架的形成之旅--实体数据模型 (EDM)的处理(4)

    在前面几篇关于Entity Framework 实体框架的介绍里面,已经逐步对整个框架进行了一步步的演化,以期达到统一.高效.可重用性等目的,本文继续探讨基于泛型的仓储模式实体框架方面的改进优化,使我 ...

  9. 第四篇 Entity Framework Plus 之 Batch Operations

    用 Entity Framework  进行 增,删,改.都是基于Model进行的,且Model都是有状态追踪的.这样Entity Framework才能正常增,删,改. 有时候,要根据某个字段,批量 ...

最新文章

  1. 网页轻松展示CV、NLP模型,连你老爸都会操作 | 斯坦福出品
  2. 没有找到 html 模板,Spring Boot and Thymeleaf:找不到HTML模板
  3. 【web必知必会】—— 图解HTTP(下)
  4. 20+ Rsync command’s switches and common usages with examples – Unix/Linux--reference
  5. Sublime Text 3添加右键
  6. asp-Webshell免杀
  7. jzoj1403-渡河【SPFA】
  8. 12-linux安装kibana
  9. 3分钟就能完成的Redis主从复制搭建
  10. C语言编程轰炸,C语言实现数字炸弹小游戏
  11. 升流式水解酸化反应器设计计算_《HJ 2047-2015 水解酸化反应器污水处理工程技术规范》.pdf...
  12. 脑电时频分析I:谱分析
  13. 股票交易接口的开发工具?
  14. 文科生能学计算机专业难吗,文科生能读计算机科学专业吗?
  15. Project2 分段切割路面,只取一个种子点
  16. tradingView警报设置
  17. 跨平台第三方平台登录和单点登录
  18. 程序员应该如何写好自己的简历
  19. OC与swift相互调用
  20. 华为交换机配置mac地址白名单接入

热门文章

  1. 计算机英语第六单元,计算机专业英语第六版第十单元课后汉译英,We do use other forms....这个do...
  2. php如何提高程序运行效率,如何提高PHP的运行效率 | 萧小寒
  3. c语言判断这天是星期几,【求指导!!】输入年,月,日,然后判断这天是星期几!!!!!...
  4. idea 升级到2020后 无法启动_升级iOS 14尝鲜后,无法降级 iOS13.5.1?
  5. 较简单的字节输入流输出流拷贝文件
  6. 键盘录入,替换敏感词
  7. leetcode189. 旋转数组
  8. TensorFlow(1)-模型相关基础概念
  9. 《机器学习实战》笔记(04):基于概率论的分类方法 - 朴素贝叶斯分类
  10. Linux gitpush错误,linux – GIT:无法推送(奇怪的配置问题)