Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описываются различия между Entity SQL и Transact-SQL.
Поддержка наследования и связей
Entity SQL работает непосредственно с концептуальными схемами сущностей и поддерживает функции концептуальной модели, такие как наследование и связи.
При работе с наследованием часто полезно выбирать экземпляры подтипа из коллекции экземпляров супертипов. Оператор oftype в Entity SQL (аналогично oftype в последовательностях C#) предоставляет эту возможность.
Поддержка коллекций
Entity SQL рассматривает коллекции как сущности первого класса. Рассмотрим пример.
Выражения коллекции допустимы в предложении
from.inиexistsподзапросы были обобщены, чтобы поддерживать любые коллекции.Вложенный запрос — это одна из типов коллекции.
e1 in e2иexists(e)являются конструкциями Entity SQL для выполнения этих операций.Операции с множествами, такие как
union,intersectиexcept, теперь работают с коллекциями.Соединения действуют в операциях с коллекциями.
Поддержка выражений
Transact-SQL содержит подзапросы (таблицы) и выражения (строки и столбцы).
Для поддержки коллекций и вложенных коллекций в Entity SQL всё является выражением. Entity SQL является более компонуемым, чем Transact-SQL— каждое выражение можно использовать в любом месте. Выражения запросов всегда приводят к коллекциям проецируемых типов и могут использоваться в любом месте, где разрешено выражение коллекции. Сведения о выражениях Transact-SQL, которые не поддерживаются в Entity SQL, см. в разделе неподдерживаемые выражения.
Ниже приведены все допустимые запросы Entity SQL:
1+2 *3
"abc"
row(1 as a, 2 as b)
{ 1, 3, 5}
e1 union all e2
set(e1)
Универсальная обработка вложенных запросов
Учитывая его акцент на таблицы, Transact-SQL выполняет контекстную интерпретацию вложенных запросов. Например, вложенный запрос в from предложении считается множеством (таблицей). Но тот же вложенный запрос, используемый в select предложении, считается скалярным вложенным запросом. Аналогичным образом, вложенный запрос, используемый слева от оператора in, считается скалярным вложенным запросом, в то время как справа ожидается мультимножественный вложенный запрос.
Entity SQL устраняет эти различия. Выражение имеет единую интерпретацию, которая не зависит от контекста, в котором он используется. Entity SQL считает все подзапросы запросами множества. Если требуется скалярное значение из подзапроса, Entity SQL предоставляет оператор anyelement, который работает с коллекцией (в данном случае подзапросом) и извлекает из коллекции одноэлементное значение.
Избежание неявных преобразований для подзапросов
Связанный побочный эффект универсального обращения с вложенными запросами — неявное преобразование вложенных запросов в скалярные значения. В частности, в Transact-SQL мультимножество строк (с одним полем) неявно преобразуется в скалярное значение, тип данных которого является типом поля.
Entity SQL не поддерживает это неявное приведение. Entity SQL предоставляет оператор ANYELEMENT для извлечения единственного значения из коллекции и оператор select value для избегания создания оболочки строк во время выражения запроса.
Выберите значение: избегайте использования неявной оболочки строк
Предложение select в вложенных запросах Transact-SQL неявно создает оболочку строки вокруг элементов в предложении. Это означает, что мы не можем создавать коллекции из скалярных величин или объектов. Transact-SQL позволяет неявное приведение между rowtype с одним полем и одиночным значением одного типа данных.
Entity SQL предоставляет select value предложение для пропуска неявного построения строк. В предложении select value может быть указан только один элемент. Если используется такое условие, то вокруг элементов в select условии не создается строковая оболочка, и может быть сформирована коллекция желаемой формы, например, select value a.
Entity SQL также предоставляет конструктор строк для создания произвольных строк.
select принимает один или несколько элементов в проекции и приводит к записи данных с полями:
select a, b, c
Левая корреляция и алиасинг
В Transact-SQL выражения в заданной области (одно предложение, например select или from) не могут ссылаться на выражения, определенные ранее в той же области. Некоторые диалекты SQL (включая Transact-SQL) поддерживают ограниченные формы этих в предложении from .
Entity SQL обобщает левую корреляцию в from предложении и обрабатывает их равномерно. Выражения в from предложении могут ссылаться на более ранние определения (определения слева) в том же предложении без необходимости дополнительного синтаксиса.
Entity SQL также накладывает дополнительные ограничения на запросы, связанные с group by операторами. Выражения в select и having предложениях таких запросов могут ссылаться на ключи group by только через их псевдонимы. Следующая конструкция допустима в Transact-SQL, но не находится в Entity SQL:
SELECT t.x + t.y FROM T AS t group BY t.x + t.y
Для этого в Entity SQL сделайте следующее:
SELECT k FROM T AS t GROUP BY (t.x + t.y) AS k
Ссылки на столбцы (свойства) таблиц (коллекции)
Все ссылки на столбцы в Entity SQL должны быть квалифицированы с помощью псевдонима таблицы. Следующая конструкция (если a это допустимый столбец таблицы T) допустима в Transact-SQL, но не в Entity SQL.
SELECT a FROM T
Форма "Entity SQL"
SELECT t.a AS A FROM T AS t
Псевдонимы таблицы являются необязательными в предложении from . Имя таблицы используется в качестве неявного псевдонима. Entity SQL также позволяет использовать следующую форму:
SELECT Tab.a FROM Tab
Навигация по объектам
Transact-SQL использует нотацию ".", чтобы ссылаться на столбцы (строка) таблицы. Entity SQL расширяет эту нотацию (заимствованную с языков программирования) для поддержки навигации по свойствам объекта.
Например, если p является выражением типа Person, ниже приведен синтаксис Entity SQL для ссылки на город адреса этого человека.
p.Address.City
Нет поддержки для *
Transact-SQL поддерживает синтаксис неквалифицированного * в качестве псевдонима всей строки и квалифицированного синтаксиса * (t.*) в качестве сокращения для полей этой таблицы. Кроме того, Transact-SQL позволяет использовать специальный агрегат count(*), который включает NULL-значения.
Entity SQL не поддерживает конструкцию *. Transact-SQL запросы формы select * from T и select T1.* from T1, T2... могут быть выражены в Entity SQL как select value t from T as t и select value t1 from T1 as t1, T2 as t2...соответственно. Кроме того, эти конструкции обрабатывают наследование (подстановку значения), а select * варианты ограничены свойствами верхнего уровня объявленного типа.
Entity SQL не поддерживает агрегатную функцию count(*). Вместо этого используйте count(0).
Изменения в группе по
Entity SQL поддерживает назначение псевдонимов для ключей group by. Выражения в select и having предложениях должны ссылаться на ключи group by через эти псевдонимы. Например, этот синтаксис Entity SQL:
SELECT k1, count(t.a), sum(t.a)
FROM T AS t
GROUP BY t.b + t.c AS k1
... эквивалентен следующему Transact-SQL:
SELECT b + c, count(*), sum(a)
FROM T
GROUP BY b + c
Collection-Based агрегаты
Entity SQL поддерживает два типа агрегатов.
Агрегаты на основе коллекций работают с коллекциями и создают агрегированный результат. Они могут отображаться в любом месте запроса и не требуют group by условия. Рассмотрим пример.
SELECT t.a AS a, count({1,2,3}) AS b FROM T AS t
Entity SQL также поддерживает агрегаты в стиле SQL. Рассмотрим пример.
SELECT a, sum(t.b) FROM T AS t GROUP BY t.a AS a
Использование конструкции ORDER BY
Transact-SQL позволяет ORDER BY указывать предложения только в самом SELECT .. FROM .. WHERE верхнем блоке. В Entity SQL можно использовать вложенное ORDER BY выражение, и его можно разместить в любом месте запроса, но порядок в вложенном запросе не сохраняется.
-- The following query will order the results by the last name
SELECT C1.FirstName, C1.LastName
FROM AdventureWorks.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 AdventureWorks.Contact as C1
ORDER BY C1.LastName) as C2
Идентификаторы
В Transact-SQL сравнение идентификаторов основано на сортировке текущей базы данных. В Entity SQL идентификаторы всегда нечувствительны к регистру и чувствительны к акцентам (т. е. Entity SQL различает акцентированные и неакцентированные символы, например, "a" не равно "ấ"). Entity SQL обрабатывает версии букв, которые отображаются одинаково, но имеют разные кодовые страницы как разные символы. Дополнительные сведения см. в разделе "Входной набор символов".
Transact-SQL функциональные возможности, недоступные в Entity SQL
Следующие Transact-SQL функции недоступны в Entity SQL.
DML
Entity SQL в настоящее время не поддерживает инструкции DML (вставка, обновление, удаление).
язык определения данных (DDL)
Entity SQL не поддерживает DDL в текущей версии.
Императивное программирование
Entity SQL не поддерживает императивное программирование, в отличие от Transact-SQL. Вместо этого используйте язык программирования.
Функции группировки
Entity SQL пока не поддерживает функции группировки (например, CUBE, ROLLUP и GROUPING_SET).
Аналитические функции
Entity SQL пока не предоставляет поддержку аналитических функций.
Встроенные функции, операторы
Entity SQL поддерживает подмножество встроенных функций и операторов Transact-SQL. Эти операторы и функции, скорее всего, будут поддерживаться основными поставщиками хранилищ данных. Entity SQL использует специальные функции, объявленные в манифесте поставщика. Кроме того, Entity Framework позволяет объявлять встроенные и определяемые пользователем функции хранилища для использования Entity SQL.
Подсказки
Entity SQL не предоставляет механизмы для подсказок запросов.
Результаты пакетного запроса
Entity SQL не поддерживает результаты пакетного запроса. Например, ниже приведено допустимое Transact-SQL (отправка как пакет):
SELECT * FROM products;
SELECT * FROM categories;
Однако эквивалентная сущность SQL не поддерживается:
SELECT value p FROM Products AS p;
SELECT value c FROM Categories AS c;
Entity SQL поддерживает только одну инструкцию запроса, создающую результат для каждой команды.