Поделиться через


Создание вложенных SQL-запросов для сущностей

Entity SQL — это расширенный функциональный язык. Стандартный блок Entity SQL — это выражение. В отличие от обычного SQL, Entity SQL не ограничивается табличным результирующим набором: Entity SQL поддерживает составление сложных выражений, которые могут иметь литералы, параметры или вложенные выражения. Значение в выражении может быть параметризовано или состоит из другого выражения.

Вложенные выражения

Вложенное выражение можно поместить в любое место, где принимается значение возвращаемого типа. Рассмотрим пример.

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

Вложенный запрос можно поместить в выражение проекции. Рассмотрим пример.

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

В Entity SQL вложенные запросы всегда должны быть заключены в скобки:

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

В следующем примере показано, как правильно вложить выражения в Entity SQL: практическое руководство. Порядок объединения двух запросов.

Вложенные запросы в проекции

Вложенные запросы в разделе проектирования могут быть переведены в запросы декартова произведения на сервере. На некоторых внутренних серверах, включая SQL Server, это может привести к тому, что таблица TempDB будет очень большой, что может негативно повлиять на производительность сервера.

Ниже приведен пример такого запроса:

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

Упорядочивание вложенных запросов

В Entity Framework вложенное выражение можно разместить в любом месте запроса. Так как Entity SQL обеспечивает большую гибкость при написании запросов, можно написать запрос, содержащий порядок вложенных запросов. Однако порядок вложенного запроса не сохраняется.

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

См. также