简介
这一系列的文章介绍的是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-SQLEntity 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支持如下操作符。
|| ||
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将参数传了进去,执行结果:
外键关系Entity SQL与其它的查询一样,可以通过外键的关系直接取值或判断,如:
ObjectQuery query = db.CreateQuery(
"SELECT VALUE o FROM Orders AS o WHERE o.Customers.Country = 'Mexico';");
我们直接用o.Customers.Country这是一个一对多的外键关系。
多条件查询与T-SQL相同,只要用相应的逻辑关键字即可。如:1
stringentitySQL =
"SELECT VALUE p FROM Products AS p WHERE p.UnitsInStock ObjectQuery query = db.CreateQuery(entitySQL);
Exists查询做为Where的一个经常用的谓词,Exists的使用方法如下:1
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(SELECT
cast(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有些不同这里给出一些例子2
按位的与、或、异或操作:
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的入门知识就介绍到这里。