Sdílet prostřednictvím


Vytváření SQL dotazů na vnořené entity

Entity SQL je bohatý funkční jazyk. Stavební blok Entity SQL je výraz. Na rozdíl od konvenčního SQL není Entity SQL omezena na tabulkovou sadu výsledků: Entity SQL podporuje vytváření složitých výrazů, které můžou obsahovat literály, parametry nebo vnořené výrazy. Hodnota ve výrazu může být parametrizována nebo složena z některého jiného výrazu.

Vnořené výrazy

Vnořený výraz lze umístit kdekoli, kde se přijímá hodnota typu, který vrací. Například:

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

Vnořený dotaz lze umístit do projekční klauzule. Například:

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

V Entity SQL musí být vnořené dotazy vždy uzavřeny v závorkách:

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

Následující příklad ukazuje, jak správně vnořit výrazy v Entity SQL: Postupy: Pořadí sjednocení dvou dotazů.

Vnořené dotazy v projekci

Vnořené dotazy v klauzuli projektu se můžou na serveru přeložit do kartézských dotazů na produkt. V některých back-endových serverech, včetně SQL Serveru, to může způsobit, že tabulka TempDB bude velmi velká, což může nepříznivě ovlivnit výkon serveru.

Následuje příklad takového dotazu:

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

Řazení a organizace vnořených dotazů

V Entity Frameworku lze vnořený výraz umístit kamkoli do dotazu. Vzhledem k tomu, že Entity SQL umožňuje velkou flexibilitu při psaní dotazů, je možné napsat dotaz, který obsahuje řazení vnořených dotazů. Pořadí vnořeného dotazu se však nezachová.

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

Viz také