Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Entity SQL è un linguaggio funzionale avanzato. Il blocco predefinito di Entity SQL è un'espressione. A differenza di SQL convenzionale, Entity SQL non è limitato a un set di risultati tabulare: Entity SQL supporta la composizione di espressioni complesse che possono avere valori letterali, parametri o espressioni annidate. Un valore nell'espressione può essere parametrizzato o composto da un'altra espressione.
Espressioni annidate
Un'espressione nidificata può essere inserita in qualsiasi punto in cui viene accettato un valore del tipo che restituisce. Per 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. Per 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.
Query annidate nella proiezione
Le query annidate nella clausola di progetto potrebbero essere convertite in query di prodotto cartesiane nel server. In alcuni server back-end, incluso SQL Server, la tabella TempDB può avere dimensioni molto grandi, che possono influire negativamente sulle prestazioni del server.
Di seguito è riportato un esempio di query di questo tipo:
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
Nell'Entity Framework, un'espressione nidificata può essere inserita in qualsiasi punto della query. Poiché Entity SQL consente una grande flessibilità nella scrittura di query, è possibile scrivere una query contenente un ordinamento di query annidate. Tuttavia, l'ordine di una query nidificata non viene 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