實體查詢語言

實體查詢語言(Entity Query Language),是基於宿主語言的Sql語句編寫接口。獨立的使用Eql可以讓開發者按照習慣的編碼方式非常方便的書寫出各種Sql語句。

基本介紹

  • 中文名:實體查詢語言
  • 外文名:Entity Query Language
  • 縮寫:Eql
  • 套用領域:資料庫等
  • 語法特點:綜合統一、高度非過程化等
  • 從屬:查詢語言
簡介,Entity SQL與T-SQL,支持與不支持的查詢,Entity SQL支持的數據類型,基本執行方法、操作符、Select及Where,執行方法,操作符,select、where的基本語法,注意,Where/Exists/In/Like/參數及外鍵查詢,參數,外鍵關係,多條件查詢,Exists查詢,IN查詢,LIKE查詢,Between、And查詢,Order By操作,返回部分查詢結果,GroupBy、位處理函式、字元串處理函式,GroupBy,函式,數字函式、時間函式及其它,數字函式,時間函式,GUID函式,

簡介

這一系列的文章介紹的是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里沒定義的 匿名類型
而在它內部也存在一些關鍵字
NULLBOOLEANINTEGERDECIMALFLOATDOUBLESTRING、DATETIME、TIME、DATETIMEOFFSET、BINARYGUID
這些類型幾乎都是可以通用於各種資料庫的。

基本執行方法、操作符、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<Customer> query = db.CreateQuery<Customer>(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<Orders>(entitySQL);
Console.WriteLine(query.ToTraceString());

參數

參數可以通過CreateQuery的第二個參數傳遞進去。
DateTime dt = newDateTime(1997, 1, 1);
ObjectParameter[] ps = { newObjectParameter("dt", dt) };
ObjectQuery<Orders> query = db.CreateQuery<Orders>("SELECT VALUE Orders FROM Orders WHERE Orders.OrderDate < @dt;", ps);
這裡通過@dt將參數傳了進去,執行結果:

外鍵關係

Entity SQL與其它的查詢一樣,可以通過外鍵的關係直接取值或判斷,如:
ObjectQuery<Orders> query = db.CreateQuery<Orders>(
"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<Products> query = db.CreateQuery<Products>(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<bool>(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<Orders>(entitySQL);

LIKE查詢

like做為一個模糊查詢的關鍵字是一定要支持的。
stringentitySQL =
@"SELECT VALUE c FROM Customers AS c WHERE c.City like '%at%';";
var query = db.CreateQuery<Orders>(entitySQL);

Between、And查詢

stringentitySQL =@"SELECT VALUE c FROM Customers AS c WHERE c.ID between 1 and 100";
var query = db.CreateQuery<Orders>(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<Customers>(entitySQL);
如果想要倒序排列的話與SQL一樣,加上DESC就可以了
stringentitySQL = "SELECT VALUE c FROM Customers AS c ORDER BY c.ContactName desc";
var query = db.CreateQuery<Customers>(entitySQL);
多條排序規則:
stringentitySQL = "SELECT VALUE c FROM Customers AS c ORDER BY c.CompanyName ASC, c.ContactTitle DESC";
ObjectQuery<Customers> query = db.CreateQuery<Customers>(entitySQL);

返回部分查詢結果

只返回一部分結果,在Linq中可以通過select new {}一個新的對象來實現,在Entity SQL中可以通過以下方法來實現
usingSystem.Data.Common;
//....若干行
stringentitySQL = "SELECT VALUE row(c.Phone,c.Country) FROM Customers as c";
ObjectQuery<DbDataRecord> query = db.CreateQuery<DbDataRecord>(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<DbDataRecord>(entitySQL);
直接進行Group by操作
而進行分組時也可以使用Count、Max、Min、Sum、Avg這幾個函式
使用方法與SQL沒有什麼不同,所以這裡僅做介紹

函式

函式部分與一般的SQL有些不同這裡給出一些例子
按位的與、或、異或操作:
db.CreateQuery<Int32>(@"BitwiseAnd(1,0)")//與 全1才1
db.CreateQuery<Int32>(@"BitwiseOr(1,0)")//或 有1即1
db.CreateQuery<Int32>(@"BitwiseXor(1,0)")//異或 不同為1
字元串處理:
db.CreateQuery<Int32>("IndexOf('d','zhongdian')")//獲取前面字元串在後面字元串中的位置,本例結果為6
db.CreateQuery<string>("Right('zhongdian',3)")//右取長度3的字元串,ian
db.CreateQuery<string>("Left('zhongdian',4)")//左取長度4的字元串,zhon
db.CreateQuery<string>("Length('abc')")//字元串長度,3
db.CreateQuery<string>("SUBSTRING('zhongdian',2,3)")//子字元串,索引2開始,取長度3,hon
db.CreateQuery<string>("LTrim(' text ')")//去除左邊空格,“text ”
db.CreateQuery<string>("RTrim(' text ')")//去除右邊空格,“ text”
db.CreateQuery<string>("Trim(' text ')")//去除兩邊空格,“text”
db.CreateQuery<string>("Replace('zhongdian','zhong','chong')")//替換,將參數1中的參數2換為參數3,chongdian
db.CreateQuery<string>("ToLower('Abc')")//轉小寫,abc
db.CreateQuery<string>("ToUpper('Abc')")//轉大寫,ABC
db.CreateQuery<string>("Reverse('Abc')")//反轉,cbA

數字函式、時間函式及其它

數字函式

db.CreateQuery<double>("Round(1.4)")//四捨五入
db.CreateQuery<double>("Floor(1.9)")//向下取整,即省去小數部分
db.CreateQuery<double>("Ceiling(1.1)")//向上取整,無論小數部分多大都進1

時間函式

db.CreateQuery<DateTime>("CurrentDateTime()")//獲取當前時間
db.CreateQuery<DateTime>("CurrentUtcDateTime()")//獲取格林威治時間
db.CreateQuery<DbDataRecord>("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<string>("CAST(NewGuid() as System.String)")//生成一個GUID值
用途:可以利用GUID來進行隨機取數據(即OrderBy NewGuid())
Entity SQL Language的入門知識就介紹到這裡。

相關詞條

熱門詞條

聯絡我們