Создание вложенных запросов Entity SQL (язык Entity 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 : Как упорядочить объединение двух запросов (платформа Entity Framework).
Вложенные запросы в проекции
Вложенные запросы в предложении проекции могут быть переведены в запросы декартового произведения на сервере. На некоторых внутренних серверах, в том числе на серверах SLQ 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