Compartilhar via


Escrevendo Consultas SQL para Entidades Aninhadas

O SQL da entidade é uma linguagem funcional avançada. O bloco de construção do Entity SQL é uma expressão. Ao contrário do SQL convencional, o SQL da Entidade não se limita a um conjunto de resultados tabulares: o SQL de entidade dá suporte à 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 onde seja aceito um valor do tipo que ela retorna. 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 colocadas 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 estar sempre 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: How to: Order the Union of Two Queries.

Consultas aninhadas na projeção

Consultas aninhadas na cláusula de projeto podem obter convertido em consultas de produto cartesiano no servidor. Em alguns servidores de 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.

Veja a seguir 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

Ordenando consultas aninhadas

No Entity Framework, uma expressão aninhada pode ser colocada em qualquer lugar na consulta. Como o Entity SQL permite grande flexibilidade na gravação 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

Consulte também