Entity Data Model (EDM)深入分析, Part 2

实体 SQL (Entity SQL),它是一种新的 SQL 语言,其中加入了之前的 SQL 语言并不支持的基于概念的查询功能。ESQL 扩展现有 SQL 语言的方式与 EDM 扩展数据库中所使用的关系模型的方式十分类似。此外,ESQL 未绑定到任何特定于后台数据库的语法,因此可一次性编写查询(和/或应用程序),无论针对的是哪个后台数据库都无影响。

Entity SQL 是基于文本的、面向集合的、延后绑定的查询语言,也受到了T-SQL的影响。可以使用Entity SQL 创建对EDM的查询,Entity SQL 既可以通过Object Services components来执行,也可以通过Entity Client components 来执行。Entity SQL 设计的非常灵活,因此也变得有些复杂。本篇文章侧重于不同的查询技术,仅仅使用简单的查询,不包含复杂的条件、关联和聚合公式。

本系列文章上一篇:

Entity Data Model (EDM) 深入分析, Part 1 

1. 使用ObjectQuery<T> 查询返回实体类型(Entity Type)集合

下面演示如何执行Entity SQL 查询,返回实体类型的实例集合。

1) 首先创建Northwind ObjectContext 实例。

2) Entity SQL语句本身是字符串表达式,在大多数情况下,由SELECT-FROM 查询语句组成。在SELECT语句中使用VALUE关键字来表示返回的实体是一条数据行。

3) 使用Object Services components 执行查询。调用ObjectContext 的工厂方法CreateQuery<T>(),创建一个ObjectQuery 对象,该对象表示对存储数据源的查询,查询表达式为Entity SQL 语句。

4) Entity Framework实体框架采用延迟装载(Deferred loading)。因此只有在显式需要数据时,才真正执行SQL语句。在这种情况下,在ForEach第一次迭代时,才执行查询语句。

NorthwindEntities context = new NorthwindEntities();

var sql = "SELECT VALUE emp FROM NorthwindEntities.Employees AS emp";
var query = context.CreateQuery<Employee>(sql);

foreach (var emp in query)
 Console.WriteLine("{0} {1} {2} {3}", emp.EmployeeID, emp.FirstName, emp.LastName, emp.Country);

除了使用工厂方法CreateQuery<T>外,也可以直接创建ObjectQuery对象实例,并传入Object Context 参数,示例代码如下:

NorthwindEntities context = new NorthwindEntities();

var sql = "NorthwindEntities.Employees";
ObjectQuery<Employee> query = new ObjectQuery<Employee>(sql, context);

foreach (var emp in query)
 Console.WriteLine("{0} {1} {2} {3}", emp.EmployeeID, emp.FirstName, emp.LastName, emp.Country);

下面增加一个WHERE条件:

var sql = "SELECT VALUE emp FROM NorthwindEntities.Employees AS emp " +
          "WHERE emp.Country = 'USA'";
var query = context.CreateQuery<Employee>(sql);

2. 带参数的ObjectQuery<T>查询

参数变量是在Entity SQL外定义的,在查询语句中需要以@符合作为前缀定义变量名。参数定义为ObjectParameter 对象,然后增加到ObjectQuery 实例中。

下面增加一个Country 变量:

var sql = "SELECT VALUE emp FROM NorthwindEntities.Employees AS emp " +
          "WHERE emp.Country = @country";
var query = context.CreateQuery<Employee>(sql);
query.Parameters.Add(new ObjectParameter("country", "USA"));

同样以ObjectQuery 示例对象实现这一功能:

var sql = "SELECT VALUE emp FROM NorthwindEntities.Employees AS emp " +
          "WHERE emp.Country = @country";
ObjectQuery<Employee> query = new ObjectQuery<Employee>(sql, context);
query.Parameters.Add(new ObjectParameter("country", "USA"));

ObjectParameter对象也可以直接传入CreateQuery<T>方法:

var sql = "SELECT VALUE emp FROM NorthwindEntities.Employees AS emp " +
          "WHERE emp.Country = @country";
var query = context.CreateQuery<Employee>(sql, new ObjectParameter("country", "USA"));

第三种方法的是使用Where 扩展方法,使用关键字it 指向当前的查询语句:

var sql = "SELECT VALUE emp FROM NorthwindEntities.Employees AS emp";
var query = context.CreateQuery<Employee>(sql)
 .Where("it.Country = @country", new ObjectParameter("country", "USA"));

时间: 2022-12-24

Entity Data Model (EDM)深入分析, Part 2的相关文章

Entity Data Model (EDM)深入分析, Part 1

Entity Data Model是.NET Framework v3.5 SP1引入的新功能,比Linq To SQL更加强大的ORM,让开发人员只需要着眼于领域对象模型的开发,而不需要考虑它们是如何与关系数据库交互.本系列文章逐步深入介绍如下内容:EDMX Schema 文件.Model Browser.映射关系.产生的实体类(Generated entity classes).文档(Documentation)等等. 1. EDMX Schema 文件 可以将EDMX作为XML文件打开,你

Entity Data Model (EDM)深入分析, Part 3

EntityClient 实体框架(Entity Framework)在ADO.NET 3.5 提供程序的基础上引入新的 ADO.NET 提供程序 EntityClient.Entity­Client 看上去与之前使用的 ADO.NET 提供程序非常类似,它将提供第一个抽象,可允许开发人员使用标准的 Connection.Command 和 DataReader 对象依照 EDM 执行查询.它还会将映射域模型所需的客户端视图引擎(根据 EDM 定义的)添加到底层关系数据库架构.必要时,Entit

比较LINQ to SQL Diagram 和Entity Data Model

LINQ to SQL Diagram(DBML)和Entity Data Model(EDMX)都是.Net Framework v3.5 引入的新特性.相信有很多人不清楚它们之间的差异,这里简要分析比较.下面以Northwind 范例数据库进行说明: LINQ to SQL 对象关系图(Object Relational Diagram) Entity Data Model (EDM) 实体数据模型

怎么添加odbc数据源作为 ado .net entity data model

问题描述 [img=http://hiphotos.baidu.com/zhidao/pic/item/9d82d158cacac000800a1892.jpg?t=1327317351142&t=1327317361175][/img] 解决方案 解决方案二:宝贝图片百度交流换个外联解决方案三:既然用了ADO.net干嘛又要用OCDB.解决方案四:图片看不到..

entity和model有什么区别

问题描述 entity和model有什么区别 entity和model有什么区别,在Android 中这两种使用场景是怎么样的? 解决方案 个人感觉,entity强调的是单个的实体,而model比较宽泛,比如说eneites聚合在一起,业务逻辑上的对象等等. 解决方案二: Entity Model

UML建模之数据建模(Data Model Diagram)

一.数据建模简介 数据建模不仅可以对象的属性建模(比如E-R图),也可以对数据的行为建模(比如触发器Trigger. 存储过程Stored Procedure).在进行数据库设计时,设计到如下几个概念: 模式 Schema.主键 Primary.外键 Foreign key.关系 Relationship.约束 constraint.索引 Index.触发器 Trigger.存储过程 Stored Procedure.视图 View. 二.数据建模元素 1.表(Table) 表是关系数据库最基本

Entity SQL Language 一 简介

  本篇约定 文章中只讲Entity SQL不讲EDM或Linq to Entities,EDM的Context一律叫做db或DB 数据库基本以EFQuerySamples的NorthwindEF为例,下载可到http://code.msdn.microsoft.com/EFQuerySamples 文章案T-SQL的语法规则渐近讲解 如果有相关知识不清楚的,可以留言问我 其实简介讲的东西后面都会仔细再讲,如赶时间可以不必看 什么是Entity SQL 这一系列的文章介绍的是Entity SQL

ADO.NET2.0跟ADO.NET3.0的一些新特性简要介绍

ado 觉得很多人在写关于ASP.NET2.0的东东,很少有人写关于ADO.NET2.0的新特性.查找了一下MSDN,给大家介绍几点好了.(如果需要察看所有ADO.NET2.0的新特性,请查看 http://msdn2.microsoft.com/en-us/library/ex6y04yf.aspx) Server Enumeration 用来枚举活动状态的SQL Server实例,版本需要在SQL2000及更新版本.使用的是SqlDataSourceEnumerator类 可以参考以下示例代

VS 2008 sp1 + .NET 3.5 sp1(1)

Entity Framework(实体框架)之添加.查询.更新和删除的Demo 介绍 以Northwind为示例数据库,ADO.NET Entity Framework之完全面向对象的添加操作.查询操作.更新 操作和删除操作 示例 Overview.html <ul> <li>ADO.NET Entity Framework(EF) - 就当是微软的ORM吧,可以将概念模型映射到逻辑模型 ,从而使用概念模型做开发 </li> <li>Entity - 在EF