Creazione di query Entity SQL annidate (Entity SQL)
Entity SQL è un linguaggio funzionale completo. L'elemento fondamentale in Entity SQL è un'espressione. A differenza del linguaggio SQL convenzionale, Entity SQL non è limitato a un set di risultati in formato di tabella. Entity SQL supporta la creazione di espressioni complesse che possono includere valori letterali, parametri o espressioni annidate. Un valore nell'espressione può includere parametri oppure può essere composto da altre espressioni.
Espressioni annidate
Un'espressione annidata può essere inserita in una posizione qualsiasi in cui è accettato un valore del tipo restituito dall'espressione. Ad esempio:
-- 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}}};
Una query annidata può essere inserita in una clausola di proiezione. Ad esempio:
-- 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
In Entity SQL le query annidate devono sempre essere racchiuse tra parentesi:
-- Pseudo-Entity SQL
( SELECT …
FROM … )
UNION ALL
( SELECT …
FROM … );
Nell'esempio seguente viene illustrato come annidare correttamente le espressioni in Entity SQL : Procedura: ordinare l'unione di due query (Entity Framework).
Query annidate nella proiezione
Le query annidate nella clausola del progetto potrebbero essere tradotte in query del prodotto cartesiano sul server. In alcuni server di back-end, tra cui Server SLQ, questo può provocare l'aumento delle dimensioni della tabella TempDB, con effetti negativi sulle prestazioni del server.
Di seguito è riportato un esempio di questo tipo di query:
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
Ordinamento di query annidate
In Entity Framework un'espressione annidata può essere inserita in un punto qualsiasi della query. Poiché Entity SQL rende molto flessibile la scrittura di query, è possibile scrivere una query contenente una serie di query annidate in ordine. L'ordine di una query annidata non viene tuttavia mantenuto.
-- 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