Condividi tramite


Creazione di query Entity SQL nidificate (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 nidificate. Un valore nell'espressione può includere parametri oppure può essere composto da altre espressioni.

Espressioni nidificate

Un'espressione nidificata 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 nidificata 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 nidificate devono sempre essere racchiuse tra parentesi:

-- Pseudo-Entity SQL
( SELECT …
FROM … )
UNION ALL
( SELECT …
FROM … );

Nell'esempio seguente viene illustrato come nidificare correttamente le espressioni in Entity SQL: Procedura: ordinare due query riunite (Entity Framework).

Query nidificate nella proiezione

Le query nidificate 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 nidificate

In Entity Framework un'espressione nidificata 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 nidificate in ordine. L'ordine di una query nidificata 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

Vedere anche

Concetti

Panoramica su Entity SQL