Partager via


Identificateurs (Entity SQL)

Les identificateurs sont utilisés dans Entity SQL pour représenter des alias d’expression de requête, des références de variables, des propriétés d’objets, des fonctions, et ainsi de suite. Entity SQL fournit deux types d’identificateurs : des identificateurs simples et des identificateurs entre guillemets.

Identificateurs simples

Un identificateur simple dans Entity SQL est une séquence de caractères alphanumériques et de trait de soulignement. Le premier caractère de l’identificateur doit être un caractère alphabétique (a-z ou A-Z).

Identificateurs entre guillemets

Un identificateur entre guillemets est une séquence de caractères entre crochets ([]). Les identificateurs entre guillemets vous permettent de spécifier des identificateurs avec des caractères non valides dans les identificateurs. Tous les caractères entre crochets font partie de l’identificateur, y compris tous les espaces blancs.

Un identificateur entre guillemets ne peut pas inclure les caractères suivants :

  • Newline.

  • Retour chariot.

  • Onglets.

  • Backspace.

  • Crochets supplémentaires (c’est-à-dire, crochets entre crochets entre crochets qui délimitent l’identificateur).

Un identificateur entre guillemets peut inclure des caractères Unicode.

Les identificateurs entre guillemets vous permettent de créer des caractères de nom de propriété qui ne sont pas valides dans les identificateurs, comme illustré dans l’exemple suivant :

SELECT c.ContactName AS [Contact Name] FROM customers AS c

Vous pouvez également utiliser des identificateurs entre guillemets pour spécifier un identificateur qui est un mot clé réservé d’Entity SQL. Par exemple, si le type Email a une propriété nommée « From », vous pouvez la lever de l’ambiguïté du mot clé réservé FROM à l’aide de crochets, comme suit :

SELECT e.[From] FROM emails AS e

Vous pouvez utiliser un identificateur entre guillemets sur le côté droit d’un opérateur dot (.).

SELECT t FROM ts as t WHERE t.[property] == 2

Pour utiliser le crochet dans un identificateur, ajoutez un crochet supplémentaire. Dans l’exemple suivant, «abc] » est l’identificateur :

SELECT t from ts as t WHERE t.[abc]]] == 2

Pour connaître la sémantique de comparaison des identificateurs entre guillemets, consultez Jeu de caractères d’entrée.

Règles d’alias

Nous vous recommandons de spécifier des alias dans les requêtes Entity SQL chaque fois que nécessaire, y compris les constructions Entity SQL suivantes :

  • Champs d’un constructeur de ligne.

  • Éléments de la clause FROM d’une expression de requête.

  • Éléments de la clause SELECT d’une expression de requête.

  • Éléments de la clause GROUP BY d’une expression de requête.

Alias valides

Les alias valides dans Entity SQL sont un identificateur simple ou un identificateur entre guillemets.

Génération d’alias

Si aucun alias n’est spécifié dans une expression de requête Entity SQL, Entity SQL tente de générer un alias en fonction des règles simples suivantes :

  • Si l’expression de requête (pour laquelle l’alias n’est pas spécifié) est un identificateur simple ou entre guillemets, cet identificateur est utilisé comme alias. Par exemple, ROW(a, [b]) devient ROW(a AS a, [b] AS [b]).

  • Si l’expression de requête est une expression plus complexe, mais que le dernier composant de cette expression de requête est un identificateur simple, cet identificateur est utilisé comme alias. Par exemple, ROW(a.a1, b.[b1]) devient ROW(a.a1 AS a1, b.[b1] AS [b1]).

Nous vous recommandons de ne pas utiliser d’alias implicite si vous souhaitez utiliser le nom d’alias ultérieurement. Chaque fois que des alias (implicites ou explicites) entrent en conflit ou sont répétés dans la même étendue, une erreur de compilation s’affiche. Un alias implicite passe la compilation même s’il existe un alias explicite ou implicite du même nom.

Les alias implicites sont générés automatiquement en fonction de l’entrée utilisateur. Par exemple, la ligne de code suivante génère NAME en tant qu’alias pour les deux colonnes et, par conséquent, est en conflit.

SELECT product.NAME, person.NAME

La ligne de code suivante, qui utilise des alias explicites, échoue également. Toutefois, l’échec sera plus apparent en lisant le code.

SELECT 1 AS X, 2 AS X …

Règles de portée

Entity SQL définit des règles d’étendue qui déterminent quand des variables particulières sont visibles dans le langage de requête. Certaines expressions ou instructions introduisent de nouveaux noms. Les règles d’étendue déterminent où ces noms peuvent être utilisés et quand ou où une nouvelle déclaration portant le même nom qu’une autre peut masquer son prédécesseur.

Lorsque les noms sont définis dans une requête Entity SQL, ils sont dits être définis dans une étendue. Une étendue couvre une région entière de la requête. Toutes les expressions ou références de noms dans une certaine étendue peuvent voir les noms définis dans cette étendue. Avant qu’une étendue commence et qu’elle se termine, les noms définis dans l’étendue ne peuvent pas être référencés.

Les étendues peuvent être imbriquées. Les parties d’Entity SQL introduisent de nouvelles étendues qui couvrent des régions entières, et ces régions peuvent contenir d’autres expressions Entity SQL qui introduisent également des étendues. Lorsque des étendues sont imbriquées, des références peuvent être apportées aux noms définis dans l’étendue la plus interne, qui contient la référence. Les références peuvent également être faites à tous les noms définis dans toutes les étendues externes. Toutes les deux étendues définies dans la même étendue sont considérées comme des étendues frères. Les références ne peuvent pas être faites aux noms définis dans les étendues frères.

Si un nom déclaré dans une étendue interne correspond à un nom déclaré dans une étendue externe, les références dans l’étendue interne ou dans les étendues déclarées dans cette étendue font uniquement référence au nom nouvellement déclaré. Le nom dans l’étendue externe est masqué.

Même dans la même étendue, les noms ne peuvent pas être référencés avant qu’ils ne soient définis.

Les noms globaux peuvent exister dans le cadre de l’environnement d’exécution. Cela peut inclure des noms de collections persistantes ou de variables d’environnement. Pour qu’un nom soit global, il doit être déclaré dans l’étendue la plus externe.

Les paramètres ne se trouvent pas dans une étendue. Étant donné que les références aux paramètres incluent une syntaxe spéciale, les noms des paramètres ne sont jamais en conflit avec d’autres noms dans la requête.

Expressions de requête

Une expression de requête Entity SQL introduit une nouvelle étendue. Les noms définis dans la clause FROM sont introduits dans l’étendue dans l’ordre d’apparence, de gauche à droite. Dans la liste de jointure, les expressions peuvent faire référence aux noms définis précédemment dans la liste. Les propriétés publiques (champs et ainsi de suite) d’éléments identifiés dans la clause FROM ne sont pas ajoutées à l’étendue. Elles doivent toujours être référencées par le nom qualifié d’alias. En règle générale, toutes les parties de l’expression SELECT sont considérées dans l’étendue.

La clause GROUP BY introduit également une nouvelle étendue frère. Chaque groupe peut avoir un nom de groupe qui fait référence à la collection d’éléments dans le groupe. Chaque expression de regroupement introduit également un nouveau nom dans l’étendue du groupe. En outre, l’agrégat imbriqué (ou le groupe nommé) est également ajouté à l’étendue. Les expressions de regroupement elles-mêmes se trouvent dans l’étendue de l’étendue. Toutefois, lorsqu’une clause GROUP BY est utilisée, la clause SELECT-list (projection), HAVING et la clause ORDER BY sont considérées comme comprises dans l’étendue du groupe, et non dans l’étendue de groupe. Les agrégats reçoivent un traitement spécial, comme décrit dans la liste à puces suivante.

Voici des remarques supplémentaires sur les étendues :

  • La liste de sélection peut introduire de nouveaux noms dans l’étendue, dans l’ordre. Les expressions de projection à droite peuvent faire référence aux noms projetés à gauche.

  • La clause ORDER BY peut faire référence aux noms (alias) spécifiés dans la liste de sélection.

  • L’ordre d’évaluation des clauses dans l’expression SELECT détermine l’ordre dans lequel les noms sont introduits dans l’étendue. La clause FROM est évaluée en premier, suivie de la clause WHERE, de la clause GROUP BY, de la clause HAVING, de la clause SELECT et enfin de la clause ORDER BY.

Gestion des agrégats

Entity SQL prend en charge deux formes d’agrégats : les agrégats basés sur des collections et les agrégats basés sur des groupes. Les agrégats basés sur des regroupements sont la construction préférée dans Entity SQL et les agrégats basés sur des groupes sont pris en charge pour la compatibilité SQL.

Lors de la résolution d’un agrégat, Entity SQL tente d’abord de le traiter comme un agrégat basé sur une collection. En cas d’échec, Entity SQL transforme l’entrée d’agrégation en référence à l’agrégat imbriqué et tente de résoudre cette nouvelle expression, comme illustré dans l’exemple suivant.

AVG(t.c) becomes AVG(group..(t.c))

Voir aussi