Compartir a través de


Crear consultas de Entity SQL anidadas (Entity SQL)

Entity SQL es un lenguaje funcional enriquecido. La unidad de creación de Entity SQL es la expresión. A diferencia del SQL convencional, Entity SQL no se limita a un conjunto de resultados tabular: Entity SQL permite crear expresiones complejas que pueden tener literales, parámetros o expresiones anidadas. Un valor de la expresión se puede parametrizar o redactar a partir de alguna otra expresión.

Expresiones anidadas

Una expresión anidada se puede colocar en cualquier parte donde se acepte un valor del tipo que devuelve. Por ejemplo:

-- 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 consulta anidada se puede colocar en una cláusula de proyección. Por ejemplo:

-- 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

En Entity SQL, las consultas anidadas siempre deben ir entre paréntesis:

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

En el siguiente ejemplo se muestra cómo anidar apropiadamente las expresiones en Entity SQL: Cómo ordenar dos consultas combinadas (Entity Framework).

Consultas anidadas en proyección

Las consultas anidadas en la cláusula del proyecto se podrían traducir en consultas de producto cartesiano en el servidor. Esto puede hacer que la tabla TempDB aumente, lo que puede afectar adversamente al rendimiento del servidor en algunos servidores de servicios backend, incluido SLQ Server.

A continuación se muestra un ejemplo de dicha 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 las consultas anidadas

En el Entity Framework, una expresión anidada se puede colocar en cualquier parte de la consulta. Dado que Entity SQL permite gran flexibilidad al escribir las consultas, es posible escribir una consulta que contenga una ordenación de las consultas anidadas. Sin embargo, el orden de una consulta anidada no se conserva.

-- 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

Vea también

Conceptos

Información general de Entity SQL