简介
这一系列的文章介绍的是EQL语言。也可以说是Entity SQL,它算是一门存储独立的语言,有些类似的SQL。它可以对Entity Data Model (EDM) 进行查询。
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 ast group by (t.x + t.y) ask这种方式
8.无法使用T-SQL的函式
它支持T-SQL的子查询和表达式,它可以用于任何支持它的资料库,这里给出一些合法的表达式:
1+2 *3
abc
row(1 asa, 2 asb)
{ 1, 3, 5}
e1 union all e2
set(e1)
举一个Entity SQL与T-SQL之间对比的例子
T-SQL
select t.x + t.y from T ast group by t.x + t.y
Entity SQL:
select k from T ast group by (t.x + t.y) ask
Entity Sql也支持这种方式
select Tab.a from Tab
Entity SQL支持的数据类型
1.那些基本类型,比如Int32和String
2.EDM的schema中定义的那些类型
3.EDM的schema里没定义的 匿名类型
而在它内部也存在一些关键字
NULL、BOOLEAN、INTEGER、DECIMAL、FLOAT、DOUBLE、STRING、DATETIME、TIME、DATETIMEOFFSET、BINARY、GUID
这些类型几乎都是可以通用于各种资料库的。
基本执行方法、操作符、Select及Where
执行方法
ObjectQuery<返回类型> query = db.CreateQuery<返回类型>(entitySQL语句);
这样就执行了所书写的Entity SQL。并返回一个ObjectQuery,它有点近似于IQueryable。
操作符
在任何语言中,操作符都是很重要的概念,Entity SQL支持如下操作符。
| 优先权 | 作用与类型 | 符号 |
1 | 层级 | .,()[] |
2 | 非 | ! not |
3 | 乘除 | * / % |
4 | 加减 | +- |
5 | 比较 | < > <= >= |
6 | 相等 | = != <> |
7 | 与 | and && |
8 | 或 | or || |
select、where的基本语法
where 做为查询最简单的语法它的实现方法如下:select value c from cs as c where e
举一个例子,这也是我们见到的第一个真正的Entity SQL
stringentitySQL = SELECT VALUE c FROM Customers AS c WHERE c.City = 'Seattle';;
ObjectQuery
注意
1.select value的value不能省去
2.语句不区分大小写
3.后面的;可以不存在。
4.上篇说到的,如果Entity SQL是select value Customers FROM Customers WHERE Customers.City = 'Seattle'也是合法的
语句与执行结果示例:
Top子句
Top的使用如下所示
select value top(1) c FROM Customers AS c WHERE c.City = 'Seattle'
Where/Exists/In/Like/参数及外键查询
先说一下查看所生成的SQL的方法,.ToTraceString() 例如:
stringentitySQL = select value a from orders as a;;var query = db.CreateQuery
参数
参数可以通过CreateQuery的第二个参数传递进去。
DateTime dt = newDateTime(1997, 1, 1);ObjectParameter[] ps = { newObjectParameter(dt, dt) };ObjectQuery
这里通过@dt将参数传了进去,执行结果:
外键关係
Entity SQL与其它的查询一样,可以通过外键的关係直接取值或判断,如:
ObjectQuery
我们直接用o.Customers.Country这是一个一对多的外键关係。
多条件查询
与T-SQL相同,只要用相应的逻辑关键字即可。如:
stringentitySQL = SELECT VALUE p FROM Products AS p WHERE p.UnitsInStock < p.ReorderLevel and p.UnitsOnOrder = 0;;ObjectQuery
Exists查询
做为Where的一个经常用的谓词,Exists的使用方法如下:
stringentitySQL = @SELECT VALUE s FROM Suppliers AS s WHERE EXISTS(SELECT p FROM s.Products AS p WHERE p.UnitsInStock = 0);;var query = db.CreateQuery
运行后生成的SQL如下:
SELECT[Extent1].[Address] AS[Address],[Extent1].[City] AS[City],[Extent1].[CompanyName] AS[CompanyName],[Extent1].[ContactName] AS[ContactName],[Extent1].[ContactTitle] AS[ContactTitle],[Extent1].[Country] AS[Country],[Extent1].[Fax] AS[Fax],[Extent1].[HomePage] AS[HomePage],[Extent1].[Phone] AS[Phone],[Extent1].[PostalCode] AS[PostalCode],[Extent1].[Region] AS[Region],[Extent1].[SupplierID] AS[SupplierID]FROM[dbo].[Suppliers] AS[Extent1]WHEREEXISTS(SELECTcast(1 asbit) AS[C1]FROM[dbo].[Products] AS[Extent2]WHERE([Extent1].[SupplierID] = [Extent2].[SupplierID]) AND([Extent2].[UnitsInStock] = 0))
IN查询
In查询当然也是不可少的。使用方法如下:stringentitySQL =@SELECT VALUE c FROM Customers AS c WHERE c.City in {'Seattle','harbin'};var query = db.CreateQuery
LIKE查询
like做为一个模糊查询的关键字是一定要支持的。
stringentitySQL =@SELECT VALUE c FROM Customers AS c WHERE c.City like '%at%';;var query = db.CreateQuery
Between、And查询
stringentitySQL =@SELECT VALUE c FROM Customers AS c WHERE c.ID between 1 and 100;var query = db.CreateQuery
Entity SQL Language 四 OrderBy/部分查询结果
Entity SQL就是Ado.net Entity Framework的一种查询语言,它简单灵活,不被语言版本所限制。
Order By操作
基本的Order By操作如下:
stringentitySQL = SELECT VALUE c FROM Customers AS c ORDER BY c.ContactName;var query = db.CreateQuery
如果想要倒序排列的话与SQL一样,加上DESC就可以了
stringentitySQL = SELECT VALUE c FROM Customers AS c ORDER BY c.ContactName desc;var query = db.CreateQuery
多条排序规则:
stringentitySQL = SELECT VALUE c FROM Customers AS c ORDER BY c.CompanyName ASC, c.ContactTitle DESC;ObjectQuery
返回部分查询结果
只返回一部分结果,在Linq中可以通过select new {}一个新的对象来实现,在Entity SQL中可以通过以下方法来实现usingSystem.Data.Common;//....若干行stringentitySQL = SELECT VALUE row(c.Phone,c.Country) FROM Customers as c;ObjectQuery
暂时还没有找到相关文档提出如何像使用正常类一样的使用这种部分查询结果
但是知道了如何去查询多个表的组合
在EDM中添加一个新类,不继承,而是添加属性利用组合来添加新类,比如添加了A和B两个实体为属性,而这个新建的类又叫Two
在写EntitySQL时select 命名空间.Two(a,b)...即可
GroupBy、位处理函式、字元串处理函式
GroupBy
对数据进行分组查询可以使用以下语法:
stringentitySQL = @SELECT o.OrderDate, Count(o.OrderID) AS Count
FROM Orders AS o GROUP BY o.OrderDate;
var query = db.CreateQuery
直接进行Group by操作
而进行分组时也可以使用Count、Max、Min、Sum、Avg这几个函式
使用方法与SQL没有什么不同,所以这里仅做介绍
函式
函式部分与一般的SQL有些不同这里给出一些例子
按位的与、或、异或操作:
db.CreateQuery
db.CreateQuery
db.CreateQuery
字元串处理:
db.CreateQuery
db.CreateQuery
db.CreateQuery
db.CreateQuery
db.CreateQuery
db.CreateQuery
db.CreateQuery
db.CreateQuery
db.CreateQuery
db.CreateQuery
db.CreateQuery
db.CreateQuery
数字函式、时间函式及其它
数字函式
db.CreateQuery
db.CreateQuery
db.CreateQuery
时间函式
db.CreateQuery
db.CreateQuery
db.CreateQuery
GUID函式
db.CreateQuery用途:可以利用GUID来进行随机取数据(即OrderBy NewGuid())
Entity SQL Language的入门知识就介绍到这里。











