实体查询语言

实体查询语言

实体查询语言(Entity Query Language),是基于宿主语言的Sql语句编写接口。独立的使用Eql可以让开发者按照习惯的编码方式非常方便的书写出各种Sql语句。

    • 中文名:实体查询语言
    • 外文名:Entity Query Language
    • 缩写:Eql
    • 套用领域:资料库等
    • 语法特点:综合统一、高度非过程化等
    • 从属:查询语言

简介

这一系列的文章介绍的是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 query = db.CreateQuery(entitySQL);

注意

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(entitySQL);Console.WriteLine(query.ToTraceString());

参数

参数可以通过CreateQuery的第二个参数传递进去。

DateTime dt = newDateTime(1997, 1, 1);ObjectParameter[] ps = { newObjectParameter(dt, dt) };ObjectQuery query = db.CreateQuery(SELECT VALUE Orders FROM Orders WHERE Orders.OrderDate < @dt;, ps);

这里通过@dt将参数传了进去,执行结果:

外键关係

Entity SQL与其它的查询一样,可以通过外键的关係直接取值或判断,如:

ObjectQuery query = db.CreateQuery(SELECT VALUE o FROM Orders AS o WHERE o.Customers.Country = 'Mexico';);

我们直接用o.Customers.Country这是一个一对多的外键关係。

多条件查询

与T-SQL相同,只要用相应的逻辑关键字即可。如:

stringentitySQL = SELECT VALUE p FROM Products AS p WHERE p.UnitsInStock < p.ReorderLevel and p.UnitsOnOrder = 0;;ObjectQuery query = db.CreateQuery(entitySQL);

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(entitySQL);

运行后生成的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(entitySQL);

LIKE查询

like做为一个模糊查询的关键字是一定要支持的。

stringentitySQL =@SELECT VALUE c FROM Customers AS c WHERE c.City like '%at%';;var query = db.CreateQuery(entitySQL);

Between、And查询

stringentitySQL =@SELECT VALUE c FROM Customers AS c WHERE c.ID between 1 and 100;var query = db.CreateQuery(entitySQL);

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(entitySQL);

如果想要倒序排列的话与SQL一样,加上DESC就可以了

stringentitySQL = SELECT VALUE c FROM Customers AS c ORDER BY c.ContactName desc;var query = db.CreateQuery(entitySQL);

多条排序规则:

stringentitySQL = SELECT VALUE c FROM Customers AS c ORDER BY c.CompanyName ASC, c.ContactTitle DESC;ObjectQuery query = db.CreateQuery(entitySQL);

返回部分查询结果

只返回一部分结果,在Linq中可以通过select new {}一个新的对象来实现,在Entity SQL中可以通过以下方法来实现

usingSystem.Data.Common;//....若干行stringentitySQL = SELECT VALUE row(c.Phone,c.Country) FROM Customers as c;ObjectQuery query = db.CreateQuery(entitySQL);query.First()[phone];//使用方法

暂时还没有找到相关文档提出如何像使用正常类一样的使用这种部分查询结果

但是知道了如何去查询多个表的组合

在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(entitySQL);

直接进行Group by操作

而进行分组时也可以使用Count、Max、Min、Sum、Avg这几个函式

使用方法与SQL没有什么不同,所以这里仅做介绍

函式

函式部分与一般的SQL有些不同这里给出一些例子

按位的与、或、异或操作:

db.CreateQuery(@BitwiseAnd(1,0))//与 全1才1

db.CreateQuery(@BitwiseOr(1,0))//或 有1即1

db.CreateQuery(@BitwiseXor(1,0))//异或 不同为1

字元串处理:

db.CreateQuery(IndexOf('d','zhongdian'))//获取前面字元串在后面字元串中的位置,本例结果为6

db.CreateQuery(Right('zhongdian',3))//右取长度3的字元串,ian

db.CreateQuery(Left('zhongdian',4))//左取长度4的字元串,zhon

db.CreateQuery(Length('abc'))//字元串长度,3

db.CreateQuery(SUBSTRING('zhongdian',2,3))//子字元串,索引2开始,取长度3,hon

db.CreateQuery(LTrim(' text '))//去除左边空格,“text ”

db.CreateQuery(RTrim(' text '))//去除右边空格,“ text”

db.CreateQuery(Trim(' text '))//去除两边空格,“text”

db.CreateQuery(Replace('zhongdian','zhong','chong'))//替换,将参数1中的参数2换为参数3,chongdian

db.CreateQuery(ToLower('Abc'))//转小写,abc

db.CreateQuery(ToUpper('Abc'))//转大写,ABC

db.CreateQuery(Reverse('Abc'))//反转,cbA

数字函式、时间函式及其它

数字函式

db.CreateQuery(Round(1.4))//四捨五入

db.CreateQuery(Floor(1.9))//向下取整,即省去小数部分

db.CreateQuery(Ceiling(1.1))//向上取整,无论小数部分多大都进1

时间函式

db.CreateQuery(CurrentDateTime())//获取当前时间

db.CreateQuery(CurrentUtcDateTime())//获取格林威治时间

db.CreateQuery(SELECT o.RequiredDate, Year(o.RequiredDate), Month(o.RequiredDate), Day(o.RequiredDate), Hour(o.RequiredDate), Minute(o.RequiredDate), Second(o.RequiredDate) FROM Orders AS o);//获取时间的年,月,日,时,分,秒的值

GUID函式

db.CreateQuery(CAST(NewGuid() as System.String))//生成一个GUID值

用途:可以利用GUID来进行随机取数据(即OrderBy NewGuid())

Entity SQL Language的入门知识就介绍到这里。

相关词条

相关搜索

其它词条