Entity SQL 是豐富的功能語言。 Entity SQL 的建置組塊是表達式。 不同於傳統 SQL,Entity SQL 不限於表格式結果集:Entity SQL 支援撰寫可具有常值、參數或巢狀表達式的複雜表達式。 表達式中的值可以參數化或由一些其他運算式所組成。
巢狀表達式
巢狀表達式可以在接受所傳回型別的值的任何位置放置。 例如:
-- Returns a hierarchical collection of three elements at top-level.
-- x must be passed in the parameter collection.
ROW(@x, {@x}, {@x, 4, 5}, {@x, 7, 8, 9})
-- Returns a hierarchical collection of one element at top-level.
-- x must be passed in the parameter collection.
{{{@x}}};
巢狀查詢可以放在投影子句中。 例如:
-- Returns a collection of rows where each row contains an Address entity.
-- and a collection of references to its corresponding SalesOrderHeader entities.
SELECT address, (SELECT DEREF(soh)
FROM NAVIGATE(address, AdventureWorksModel.FK_SalesOrderHeader_Address_BillToAddressID) AS soh)
AS salesOrderHeader FROM AdventureWorksEntities.Address AS address
在 Entity SQL 中,巢狀查詢必須一律以括弧括住:
-- Pseudo-Entity SQL
( SELECT …
FROM … )
UNION ALL
( SELECT …
FROM … );
下列範例示範如何在 Entity SQL 中正確巢狀運算式:如何排序兩個查詢的聯集。
投影中的巢狀查詢
專案子句中的巢狀查詢可能會轉譯成伺服器上的笛卡兒產品查詢。 在某些後端伺服器,包括 SQL Server 中,這可能會導致 TempDB 資料表變得非常大,這可能會對伺服器效能造成負面影響。
以下是這類查詢的範例:
SELECT c, (SELECT c, (SELECT c FROM AdventureWorksModel.Vendor AS c ) As Inner2 FROM AdventureWorksModel.JobCandidate AS c ) As Inner1 FROM AdventureWorksModel.EmployeeDepartmentHistory AS c
排序巢狀查詢
在 Entity Framework 中,巢狀表達式可以放在查詢中的任何位置。 因為 Entity SQL 允許在撰寫查詢時有很大的彈性,所以可以撰寫包含巢狀查詢排序的查詢。 不過,不會保留巢狀查詢的順序。
-- The following query will order the results by last name.
SELECT C1.FirstName, C1.LastName
FROM AdventureWorksModel.Contact as C1
ORDER BY C1.LastName
-- In the following query, ordering of the nested query is ignored.
SELECT C2.FirstName, C2.LastName
FROM (SELECT C1.FirstName, C1.LastName
FROM AdventureWorksModel.Contact as C1
ORDER BY C1.LastName) as C2