簡介
這一系列的文章介紹的是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子句
3.
union, intersect, except來表示並交差集
5.支持p.Address.City 這種級聯查詢
6.不支持去懂整*操作
7.
group by時也要select k from T ast group by (t.x + t.y) ask這種方式
它支持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支持的數據類型
3.EDM的schema里沒定義的 匿名類型
而在它內部也存在一些關鍵字
這些類型幾乎都是可以通用於各種資料庫的。
基本執行方法
執行方法
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<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子句
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查詢
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如下:
[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].[HomePage]
AS[HomePage],
[Extent1].[Phone]
AS[Phone],
[Extent1].[PostalCode]
AS[PostalCode],
[Extent1].[Region]
AS[Region],
[Extent1].[SupplierID]
AS[SupplierID]
FROM[dbo].[Suppliers]
AS[Extent1]
FROM[dbo].[Products]
AS[Extent2]
WHERE([Extent1].[SupplierID] = [Extent2].[SupplierID])
AND([Extent2].[
UnitsInStock] = 0)
)
IN查詢
stringentitySQL =
@"SELECT VALUE c FROM Customers AS c WHERE c.City in {'Seattle','harbin'}";
var query = db.CreateQuery<Orders>(entitySQL);
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操作
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);
而進行分組時也可以使用Count、Max、Min、Sum、Avg這幾個函式
函式
函式部分與一般的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的入門知識就介紹到這裡。
這些類型幾乎都是可以通用於各種資料庫的。
基本執行方法
執行方法
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<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子句
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查詢
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如下:
[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].[HomePage]
AS[HomePage],
[Extent1].[Phone]
AS[Phone],
[Extent1].[PostalCode]
AS[PostalCode],
[Extent1].[Region]
AS[Region],
[Extent1].[SupplierID]
AS[SupplierID]
FROM[dbo].[Suppliers]
AS[Extent1]
FROM[dbo].[Products]
AS[Extent2]
WHERE([Extent1].[SupplierID] = [Extent2].[SupplierID])
AND([Extent2].[
UnitsInStock] = 0)
)
IN查詢
stringentitySQL =
@"SELECT VALUE c FROM Customers AS c WHERE c.City in {'Seattle','harbin'}";
var query = db.CreateQuery<Orders>(entitySQL);
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操作
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);
而進行分組時也可以使用Count、Max、Min、Sum、Avg這幾個函式
函式
函式部分與一般的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()")//獲取格林威治時間