Skapa kapslade SQL-frågor för entitet
Entitets-SQL är ett omfattande funktionellt språk. Byggblocket i Entity SQL är ett uttryck. Till skillnad från konventionell SQL är entitets-SQL inte begränsat till en tabellresultatuppsättning: Entitets-SQL har stöd för att skapa komplexa uttryck som kan ha literaler, parametrar eller kapslade uttryck. Ett värde i uttrycket kan parametriseras eller bestå av något annat uttryck.
Kapslade uttryck
Ett kapslat uttryck kan placeras var som helst där ett värde av den typ som returneras accepteras. Till exempel:
-- 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}}};
En kapslad fråga kan placeras i en projektionssats. Till exempel:
-- 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
I Entitets-SQL måste kapslade frågor alltid omges av parenteser:
-- Pseudo-Entity SQL
( SELECT …
FROM … )
UNION ALL
( SELECT …
FROM … );
I följande exempel visas hur du kapslar uttryck korrekt i entitets-SQL: Så här beställer du unionen med två frågor.
Kapslade frågor i projektion
Kapslade frågor i projektsatsen kan översättas till kartesiska produktfrågor på servern. I vissa serverdelsservrar, inklusive SQL Server, kan detta göra att TempDB-tabellen blir mycket stor, vilket kan påverka serverns prestanda negativt.
Följande är ett exempel på en sådan fråga:
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
Beställa kapslade frågor
I Entity Framework kan ett kapslat uttryck placeras var som helst i frågan. Eftersom Entitets-SQL ger stor flexibilitet när det gäller att skriva frågor är det möjligt att skriva en fråga som innehåller en ordning på kapslade frågor. Ordningen på en kapslad fråga bevaras dock inte.
-- 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