Как Entity SQL отличается от Transact-SQL

В этой статье описываются различия между 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 выражения в заданной область (одно предложение или selectfrom) не могут ссылаться на выражения, определенные ранее в том же область. Некоторые диалекты 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 поддерживает синтаксис unqualified * в качестве псевдонима для всей строки, а соответствующий синтаксис * (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).

Изменения на предложение Group By

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

Статистические функции на основе коллекций

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  

Identifiers

В 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 поддерживает только одну инструкцию запроса, создающую результат для каждой команды.

См. также