Entity Framework 学习总结之六:EntitySQL 介绍入门

Entity SQL Language 简介

什么是 Entity SQL

Entity SQL 类似 SQL 语言,它的存在是为了查询 ADO.NET Entity Framework EF ),以用于支持 Entity Data Model EDM EDM 表示一组实体与关系( ER )的集合,映射到指定的数据源(可以是 MsSql 或其它类型的数据库)。 Entity SQL 支持 EDM ,使用户能够有效地查询数据。

 

Entity SQL T-SQL

Entity SQL 支持 EDM 的直接查询,包括它的继承及关系。它在语法上与 T-SQL 类似,但也有很多不同。

 

支持与不支持的查询:

1) from 子句

2) in exists

3) union, intersect, except 来表示并交差集

4) join 表达式

5) 支持 p.Address.City 这种级联查询

6) 不支持 * 操作

7) group by 时也要 select k from T as t group by (t.x + t.y) as k 这种方式

8) 无法使用 T-SQL 的函数

 

它支持 T-SQL 的子查询和表达式,它可以用于任何支持它的数据库,这里给出一些合法的表达式:

·    1+2 *3

·    "abc"

·    row(1 as a, 2 as b)

·    { 1, 3, 5}

·    e1 union all e2

·    set(e1)

 

对比的例子:

T-SQL select t.x + t.y from T as t group by t.x + t.y

Entity SQL select k from T as t group by (t.x + t.y) as k

 

Entity Sql 也支持这种方式: select Tab.a from Tab

 

Entity SQL 支持的数据类型:

·    第一类是原始数据类型,例如 EMD.Int32

·    第二类是在模式( Schema )中定义的类型,例如实体类型、关系类型等;

·    第三类是临时出现的类型:像集合、行和引用,它们都是匿名类型。

 

临时出现的类型

首先,为什么管它们叫归结为临时出现的类型?大家知道, EF 采用对象模型,而 SQL 等数据库是关系模型,它们之间要进行数据传递,必然有一个关系模型到对象模型的转换;另外,关系模型的相互数据交换,也可借用一下这些类型直接进行,而不必绕圈子。而这些类型的数据,一旦这个交互种过结束,也就意味着这个类型的对象将会消亡。故将这一些类型归结为一类。

 

其次,这一类包含了哪些数据类型?

1) 集合( Collection

2) 行( Row

3) 引用 (Ref)

 

集合: 使用 MULTISET() 或者花括号 ——{} 来创建,例如: MULTISET("Lenovo", "HP", "ASUS") ,这等价于: {"Lenovo", "HP", "ASUS"}

 

可以用集合返回一系列的值,例如: SELECT BRAND FROM MULTISET("Lenovo", "HP", "ASUS") AS BRAND

Entity Framework 学习总结之六:EntitySQL 介绍入门

 

这将返回三个 String 类型的行,每行一个品牌名称。

 

再如: MAX(MULTISET("Lenovo", "HP", "ASUS")) ,将会根据字母进行排序后,返回值最大的字符串 ——Lenovo

 

行: 行的概念比较简单,它使用关键字 ROW 构建,形成一个行对象。例如: ROW("Lenovo" as Brand, "T61" as Type) ,将会返回一个由 Brand Type 列构成的行对象。

 

将行和集合稍作组合,便可以返回一个多行的集合: MULTISET(ROW("Lenovo" as Brand, "T61" as Type),ROW("HP" as Brand, "V3911TU" as Type))

 

注:列名称取的是第一个行对象的别名,下面这个语句,跟上面这一语句是等效的: MULTISET(ROW("Lenovo" as Brand, "T61" as Type),ROW("HP" as aaa, "V3911TU" as bbb))

 

引用: 相当于数据库中的指针。有两种方式来创建引用。

 

第一种,使用 REF 关键字。

select value c from NorthwindEntities . Customers as c

将返回所有的 Customers 的对象集合。

 

那么,通过添加关键字 REF

select ref (c) from NorthwindEntities . Customers as c

将返回一个引用集合:

Entity Framework 学习总结之六:EntitySQL 介绍入门

 

第二种,使用 CREATEREF 关键字。例如:

CREATEREF ( NorthwindEntities . Employees , ROW ( 1 ));

其中使用 ROW 关 键字,传入需要引用的行的主键的值。那么,我们有什么必要去使用引用?我们可以把引用看成是一种获取数据的轻型的解决方案,我们记录了在哪儿去获取值,但 是并没有真正的数据获取出来,这样,不到必要时候,就没有必要在应用程序和数据库之间传递大量的数据。在上面那条语句中,我们并没有取出所有的值。而一旦 必要,只要访问一下这个实体集的任意一个属性,或者使用 DEREF 表达式,即可获取数据。

 

例如: CREATEREF ( NorthwindEntities . Employees , ROW ( 2 )). Address

Entity Framework 学习总结之六:EntitySQL 介绍入门

 

如果要获取整个行的,则使用 DEREF DEREF ( CREATEREF ( NorthwindEntities . Employees , ROW ( 2)))

 

其实,如果我们改一个形式:

DEREF ( CREATEREF ( NorthwindEntities . Employees , ROW (@ EmployeeID )))

 

在实际应用中,我们经常要根据主键,来获取一个实体,这时,把传入的主键参数化,返回整个实体。这也可以算是一个典型应用了。

 

注释

Entity SQL 查询可以包含注释。注释行以两个短划线 (--) 开头。

例如: " select ref (c) from NorthwindEntities . Customers as c -- this a comment "

 

ESQL 内部存在一些关键字: NULL BOOLEAN INTEGER DECIMAL FLOAT DOUBLE STRING DATETIME TIME DATETIMEOFFSET BINARY GUID

 

这些类型几乎都是可以通用于各种数据库的。 Entity SQL 支持的字符集: UTF-16

你可能感兴趣的:(framework)