Compondo consultas SQL de entidade aninhada
Entity SQL é uma linguagem funcional rica. O bloco de construção do Entity SQL é uma expressão. Ao contrário do SQL convencional, o Entity SQL não está limitado a um conjunto de resultados tabulares: o Entity SQL suporta a composição de expressões complexas que podem ter literais, parâmetros ou expressões aninhadas. Um valor na expressão pode ser parametrizado ou composto por alguma outra expressão.
Expressões aninhadas
Uma expressão aninhada pode ser colocada em qualquer lugar em que um valor do tipo que ela retorna seja aceito. Por exemplo:
-- 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}}};
Uma consulta aninhada pode ser colocada em uma cláusula de projeção. Por exemplo:
-- 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
No Entity SQL, as consultas aninhadas devem ser sempre colocadas entre parênteses:
-- Pseudo-Entity SQL
( SELECT …
FROM … )
UNION ALL
( SELECT …
FROM … );
O exemplo a seguir demonstra como aninhar corretamente expressões no Entity SQL: Como: Ordenar a união de duas consultas.
Consultas aninhadas na projeção
As consultas aninhadas na cláusula do projeto podem ser traduzidas em consultas de produto cartesianas no servidor. Em alguns servidores back-end, incluindo o SQL Server, isso pode fazer com que a tabela TempDB fique muito grande, o que pode afetar negativamente o desempenho do servidor.
Segue-se um exemplo dessa consulta:
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
Ordenar consultas aninhadas
No Entity Framework, uma expressão aninhada pode ser colocada em qualquer lugar da consulta. Como o Entity SQL permite grande flexibilidade na escrita de consultas, é possível escrever uma consulta que contenha uma ordenação de consultas aninhadas. No entanto, a ordem de uma consulta aninhada não é preservada.
-- 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