Идентификаторы (Entity SQL)
Идентификаторы используются в Entity SQL для представления псевдонимов выражений запроса, ссылок на переменные, свойств объектов, функций и т. д. Entity SQL предоставляет два типа идентификаторов: простые идентификаторы и кавычки.
Простые идентификаторы
Простой идентификатор в Entity SQL — это последовательность буквенно-цифровых символов и символов подчеркивания. Первым символом в идентификаторе должен быть алфавитный символ (a-z или A-Z).
Заключенные в кавычки идентификаторы
Заключенный в кавычки идентификатор - это любая последовательность символов, заключенная в квадратные скобки ([]). Заключенные в кавычки идентификаторы позволяют задавать идентификаторы с символами, которые нельзя использовать в простых идентификаторах. Все символы между квадратными скобками становятся частью идентификатора, включая все пробелы.
Заключенный в кавычки идентификатор не может содержать следующие символы.
Перевод строки.
Возврат каретки.
Табуляция.
Возврат на одну позицию назад.
Дополнительные квадратные скобки (то есть квадратные скобки внутри квадратных скобок, выделяющих идентификатор).
Заключенный в кавычки идентификатор может содержать символы Юникода.
Как показано в следующем примере, заключенные в кавычки идентификаторы позволяют создавать символы для имен свойств, которые нельзя использовать в простых идентификаторах:
SELECT c.ContactName AS [Contact Name] FROM customers AS c
Можно также использовать кавычки идентификаторов для указания идентификатора, который является зарезервированным ключевое слово Entity SQL. Например, если у типа Email
есть свойство «From», то при помощи квадратных скобок его можно отличить от зарезервированного ключевого слова FROM следующим образом:
SELECT e.[From] FROM emails AS e
Заключенный в кавычки идентификатор можно использовать в правой части оператора «точка» (.).
SELECT t FROM ts as t WHERE t.[property] == 2
Чтобы использовать в идентификаторе квадратную скобку, добавьте дополнительную квадратную скобку. В следующем примере «abc]
» является идентификатором.
SELECT t from ts as t WHERE t.[abc]]] == 2
Сведения о семантике сравнения кавычек см. в разделе "Входной набор символов".
Правила присвоения псевдонимов
При необходимости рекомендуется указывать псевдонимы в запросах Entity SQL, включая следующие конструкции Entity SQL:
Поля конструктора строк.
Элементы в предложении FROM выражения запроса.
Элементы в предложении SELECT выражения запроса.
Элементы в предложении GROUP BY выражения запроса.
Допустимые псевдонимы
Допустимые псевдонимы в Entity SQL — это любой простой идентификатор или идентификатор кавычки.
Создание псевдонима
Если псевдоним не указан в выражении запроса Entity SQL, Entity SQL пытается создать псевдоним на основе следующих простых правил:
Если выражение запроса (в котором не задан псевдоним) является простым или заключенным в кавычки идентификатором, то он используется в качестве псевдонима. Например,
ROW(a, [b])
преобразуется вROW(a AS a, [b] AS [b])
.Если выражение запроса более сложное, но последним его компонентом является простой идентификатор, тогда в качестве псевдонима используется этот идентификатор. Например,
ROW(a.a1, b.[b1])
преобразуется вROW(a.a1 AS a1, b.[b1] AS [b1])
.
Если в будущем планируется использование псевдонима, не рекомендуется прибегать к неявному присвоению псевдонимов. Результатом любого конфликта псевдонимов (неявных или явных) или их повторения в одной области будет ошибка компиляции. Неявный псевдоним пройдет компиляцию при наличии явного или неявного псевдонима с таким же именем.
Неявные псевдонимы формируются автоматически на основе ввода пользователя. Например, следующая строка кода сформирует для обоих столбцов псевдоним NAME, что приведет к конфликту.
SELECT product.NAME, person.NAME
Следующая строка кода, в которой использованы явные псевдонимы, также завершится неудачно. Однако, прочитав код, можно яснее увидеть ошибку.
SELECT 1 AS X, 2 AS X …
Правила области видимости
Entity SQL определяет правила области, определяющие, когда определенные переменные видны на языке запросов. Некоторые выражения или инструкции вводят новые имена. Правила области определяют, где можно использовать эти имена, а также когда и где новая декларация с таким же именем, как у другой, может скрывать предшествующую ей декларацию.
Если имена определяются в запросе Entity SQL, они определяются в область. Область охватывает весь регион запроса. Все выражения или ссылки на имена в конкретной области могут видеть имена, определенные в этой области. На имена, определенные в данной области, нельзя ссылаться до начала области и после ее конца.
Области могут быть вложенными. В частях Entity SQL представлены новые область, охватывающие целые регионы, и эти регионы могут содержать другие выражения Entity SQL, которые также представляют область. Когда есть вложенные области, можно ссылаться на имена, определенные в самой глубоко вложенной области, которая содержит ссылку. Также можно создавать ссылки на любые имена, определенные в любых внешних областях. Любые две области, находящиеся внутри одной области, считаются областями одного уровня. Нельзя создавать ссылки на имена, определенные в разных областях одного уровня.
Если имя, объявленное во внутренней области, совпадает с именем, объявленным во внешней области, ссылки внутри этой внутренней области или внутри областей, объявленных внутри этой области, указывают только на вновь объявленное имя. Имя во внешней области скрыто.
Нельзя создавать ссылки на имена до их объявления, даже внутри одной области.
Глобальные имена могут существовать как часть среды выполнения. Это могут быть имена постоянных коллекций или переменных среды. Чтобы имя стало глобальным, его необходимо объявить в наиболее внешней области.
Параметры не входят в области. Поскольку ссылки на параметры содержат специальный синтаксис, имена параметров никогда не конфликтуют с другими именами в запросе.
Выражения запросов
Выражение запроса Entity SQL представляет новый область. Имена, определенные в предложении FROM, вводятся в область from в порядке появления, слева направо. В списке соединений выражения могут ссылаться на имена, которые определены в списке ранее. Открытые свойства (поля и так далее) элементов, идентифицированных в предложении FROM, в область from не добавляются. В ссылке на них следует всегда использовать имя псевдонима. Обычно считается, что все части выражения SELECT находятся в области from.
Предложение GROUP BY также вводит новую область одного уровня. Каждая группа может иметь имя группы, которое ссылается на коллекцию элементов в группе. Каждое выражение группирования также вводит новое имя в область группы. Кроме того, в эту область также добавляется статистическое выражение вложения (или группа с именем). Сами выражения группирования находятся в области from. Однако при использовании предложения GROUP BY считается, что список выбора (проекция), предложение HAVING и предложение ORDER BY находятся в области группы, а не в области from. Статистические выражения обрабатываются особым образом, как описано в следующем маркированном списке.
Далее приведены дополнительные замечания об областях.
Список выбора может вводить в область новые имена по порядку. Расположенные справа выражения проекций могут ссылаться на имена в проекциях слева.
Предложение ORDER BY может ссылаться на имена (псевдонимы), указанные в списке выбора.
Порядок оценки предложений внутри выражения SELECT определяет порядок, в котором имена вводятся в область. Первым оценивается предложение FROM, затем предложения WHERE, GROUP BY, HAVING, SELECT и, наконец, предложение ORDER BY.
Обработка статистических выражений
Entity SQL поддерживает две формы статистических выражений: агрегаты на основе коллекций и агрегаты на основе групп. Агрегаты на основе коллекции являются предпочтительной конструкцией в Entity SQL, а агрегаты на основе групп поддерживаются для совместимости SQL.
При разрешении агрегата Entity SQL сначала пытается рассматривать его как агрегат на основе коллекции. Если это не удается, Entity SQL преобразует агрегатные входные данные в ссылку на вложенный агрегат и пытается устранить это новое выражение, как показано в следующем примере.
AVG(t.c) becomes AVG(group..(t.c))