Composition de sous-requêtes Entity SQL (Entity SQL)
Entité SQL est un langage fonctionnel riche. Le bloc de construction d'Entité SQL est une expression. À la différence du langage SQL classique, Entité SQL n'est pas limité à un jeu de résultats tabulaire : Entité SQL prend en charge la composition d'expressions complexes pouvant contenir des littéraux, des paramètres ou des expressions imbriquées. Une valeur de l'expression peut être paramétrée ou composée d'une autre expression.
Expressions imbriquées
Une expression imbriquée peut être placée partout où une valeur du type qu'elle retourne est acceptée. Par exemple :
-- 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}}};
Une requête imbriquée peut être placée dans une clause de projection. Par exemple :
-- 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
Dans Entité SQL, les requêtes imbriquées doivent toujours être placées entre parenthèses :
-- Pseudo-Entity SQL
( SELECT …
FROM … )
UNION ALL
( SELECT …
FROM … );
L'exemple suivant montre comment imbriquer correctement des expressions dans Entité SQL : Procédure : classer deux requêtes unies (Entity Framework).
Requêtes imbriquées dans la projection
Les requêtes imbriquées d'une clause de projection peuvent être traduites en requêtes de produit cartésien sur le serveur. Sur certains serveurs principaux dont SQL Server, cela peut avoir pour conséquences l'augmentation de volume de la table TempDB et une diminution des performances du serveur.
Vous trouverez ci-dessous un exemple de ce type de requête :
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
Ordre des requêtes imbriquées
Dans Entity Framework, une expression imbriquée peut être placée n'importe où dans la requête. Entity SQL offrant une grande souplesse dans l'écriture des requêtes, il est possible d'écrire une requête qui contient un classement des requêtes imbriquées. Toutefois, l'ordre d'une requête imbriquée n'est pas conservé.
-- 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