Zusammenstellen verschachtelter Entity SQL-Abfragen

Entity SQL ist eine funktionsreiche Sprache. Die Bausteine von Entity SQL sind Ausdrücke. Im Unterschied zu konventionellem SQL ist Entity SQL nicht auf tabellarische Resultsets beschränkt: Entity SQL unterstützt komplexe Ausdrücke, die Literale, Parameter oder geschachtelte Ausdrücke enthalten können. Ein Wert im Ausdruck kann parametrisiert sein oder aus einem anderen Ausdruck bestehen.

Geschachtelte Ausdrücke

Ein geschachtelter Ausdruck kann an jeder Stelle verwendet werden, an der der Wert des Rückgabetyps zulässig ist. Beispiel:

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

Eine geschachtelte Abfrage kann in einer Projektionsklausel enthalten sein. Beispiel:

-- 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 Entity SQL müssen geschachtelte Abfragen stets in Klammern eingeschlossen werden:

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

Im folgenden Beispiel wird veranschaulicht, wie Ausdrücke in Entity SQL ordnungsgemäß geschachtelt werden: Sortieren zweier mit dem Union-Befehl zusammengefasster Abfragen.

Geschachtelte Abfragen in Projektion

Geschachtelte Abfragen in der Projektklausel könnten auf dem Server in Abfragen des kartesischen Produkts übersetzt werden. Bei einigen Backendservern, einschließlich SQL Server, kann hierdurch die TempDB-Tabelle sehr groß werden, was die Serverleistung beeinträchtigen kann.

Das folgende Beispiel zeigt eine Abfrage dieser Art:

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

Reihenfolge geschachtelter Abfragen

In Entity Framework kann ein geschachtelter Ausdruck an einer beliebigen Stelle in die Abfrage eingefügt werden. Da Entity SQL große Flexibilität beim Schreiben von Abfragen zulässt, kann eine Abfrage mit einer Reihe von geschachtelten Abfragen geschrieben werden. Die Reihenfolge einer geschachtelten Abfrage wird jedoch nicht beibehalten.

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

Siehe auch