Delen via


Geneste entiteits-SQL-query's opstellen

Entity SQL is een uitgebreide functionele taal. De bouwsteen van Entity SQL is een expressie. In tegenstelling tot conventionele SQL is Entity SQL niet beperkt tot een tabellaire resultatenset: Entity SQL biedt ondersteuning voor het opstellen van complexe expressies die letterlijke waarden, parameters of geneste expressies kunnen hebben. Een waarde in de expressie kan worden geparameteriseerd of samengesteld uit een andere expressie.

Geneste expressies

Een geneste expressie kan overal worden geplaatst waar een waarde van het type wordt geretourneerd. Voorbeeld:

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

Een geneste query kan worden geplaatst in een projectiecomponent. Voorbeeld:

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

In Entiteit SQL moeten geneste query's altijd tussen haakjes staan:

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

In het volgende voorbeeld ziet u hoe u expressies correct kunt nesten in Entity SQL: Instructies: De samenvoeging van twee query's ordenen.

Geneste query's in projectie

Geneste query's in de projectcomponent kunnen worden vertaald in cartesische productquery's op de server. In sommige back-endservers, waaronder SQL Server, kan dit ertoe leiden dat de TempDB-tabel zeer groot wordt, wat de serverprestaties nadelig kan beïnvloeden.

Hier volgt een voorbeeld van een dergelijke query:

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

Geneste query's bestellen

In Entity Framework kan een geneste expressie overal in de query worden geplaatst. Omdat Entity SQL veel flexibiliteit biedt bij het schrijven van query's, is het mogelijk om een query te schrijven die een volgorde van geneste query's bevat. De volgorde van een geneste query blijft echter niet behouden.

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

Zie ook