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

 

这将返回三个 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

将返回一个引用集合:

 

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

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

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

 

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

 

如果要获取整个行的,则使用 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值