Partager via


Composition de requêtes Entity SQL imbriquées

Entity SQL est un langage fonctionnel riche. Le bloc de construction d’Entity SQL est une expression. Contrairement à SQL classique, Entity SQL n’est pas limité à un jeu de résultats tabulaire : Entity SQL prend en charge la composition d’expressions complexes pouvant avoir des littéraux, des paramètres ou des expressions imbriquées. Une valeur dans 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 n’importe 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 Entity 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 les expressions dans Entity SQL : Comment : commander l’union de deux requêtes.

Requêtes imbriquées dans la projection

Les requêtes imbriquées dans la clause de projet peuvent être traduites en requêtes de produit cartesiennes sur le serveur. Dans certains serveurs d'arrière-plan, y compris SQL Server, cela peut entraîner la table TempDB à devenir très volumineuse, ce qui peut affecter négativement les performances du serveur.

Voici un exemple de requête de ce type :

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

Classement des requêtes imbriquées

Dans Entity Framework, une expression imbriquée peut être placée n’importe où dans la requête. Étant donné que Entity SQL offre une grande flexibilité dans l’écriture de 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

Voir aussi