Identificatori (Entity SQL)Identifiers (Entity SQL)

Gli identificatori vengono usati in Entity SQLEntity SQL per rappresentare alias di espressioni di query, riferimenti di variabili, proprietà di oggetti, funzioni e così via.Identifiers are used in Entity SQLEntity SQL to represent query expression aliases, variable references, properties of objects, functions, and so on. Entity SQLEntity SQL sono disponibili due tipi di identificatori: gli identificatori semplici e gli identificatori tra virgolette. provides two kinds of identifiers: simple identifiers and quoted identifiers.

Identificatori sempliciSimple Identifiers

Un identificatore semplice in Entity SQLEntity SQL è una sequenza di caratteri alfanumerici e caratteri di sottolineatura.A simple identifier in Entity SQLEntity SQL is a sequence of alphanumeric and underscore characters. Il primo carattere dell'identificatore deve essere un carattere alfabetico (a-z o A-Z).The first character of the identifier must be an alphabetical character (a-z or A-Z).

Identificatori delimitatiQuoted Identifiers

Un identificatore delimitato è una qualsiasi sequenza di caratteri racchiusi tra parentesi quadre ([]).A quoted identifier is any sequence of characters enclosed in square brackets ([]). Gli identificatori delimitati consentono di specificare gli identificatori con caratteri che non sono validi negli identificatori.Quoted identifiers let you specify identifiers with characters that are not valid in identifiers. Tutti i caratteri racchiusi tra le parentesi quadre diventano parte dell'identificatore, inclusi tutti gli spazi vuoti.All characters between the square brackets become part of the identifier, including all whitespace.

Un identificatore delimitato non può includere i caratteri seguenti:A quoted identifier cannot include the following characters:

  • Carattere di nuova riga.Newline.

  • Ritorno a capo.Carriage returns.

  • Tabulazione.Tabs.

  • Backspace.Backspace.

  • Parentesi quadre aggiuntive (ovvero, parentesi quadre all'interno delle parentesi quadre che delineano l'identificatore).Additional square brackets (that is, square brackets within the square brackets that delineate the identifier).

Un identificatore delimitato può includere caratteri Unicode.A quoted-identifier can include Unicode characters.

Gli identificatori delimitati consentono di creare caratteri per i nomi delle proprietà non validi negli identificatori, come illustrato nell'esempio seguente:Quoted identifiers enable you to create property name characters that are not valid in identifiers, as illustrated in the following example:

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

È inoltre possibile usare gli identificatori delimitati per specificare un identificatore che corrisponde a una parola chiave riservata di Entity SQLEntity SQL.You can also use quoted identifiers to specify an identifier that is a reserved keyword of Entity SQLEntity SQL. Se, ad esempio, il tipo Email dispone di una proprietà denominata "From", è possibile evitare l'ambiguità con la parola chiave riservata FROM usando parentesi quadre, come illustrato di seguito:For example, if the type Email has a property named "From", you can disambiguate it from the reserved keyword FROM by using square brackets, as follows:

SELECT e.[From] FROM emails AS e

È possibile usare un identificatore tra virgolette sul lato destro di un operatore punto (.)You can use a quoted identifier on the right side of a dot (.) operator.

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

Per usare la parentesi quadra in un identificatore, aggiungere un'ulteriore parentesi quadra.To use the square bracket in an identifier, add an extra square bracket. Nell'esempio seguente "abc]" è l'identificatore:In the following example "abc]" is the identifier:

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

Per la semantica di confronto identificatore tra virgolette, vedere Set di caratteri di Input.For quoted identifier comparison semantics, see Input Character Set.

Regole relative all'utilizzo degli aliasAliasing Rules

Si consiglia di specificare gli alias nelle Entity SQLEntity SQL quando necessario, tra cui una query Entity SQLEntity SQL costruisce:We recommend specifying aliases in Entity SQLEntity SQL queries whenever needed, including the following Entity SQLEntity SQL constructs:

  • Campi di un costruttore ROW.Fields of a row constructor.

  • Elementi nella clausola FROM di un'espressione di query.Items in the FROM clause of a query expression.

  • Elementi nella clausola SELECT di un'espressione di query.Items in the SELECT clause of a query expression.

  • Elementi nella clausola GROUP BY di un'espressione di query.Items in the GROUP BY clause of a query expression.

Alias validiValid Aliases

Alias validi in Entity SQLEntity SQL eventuali semplice identificatore o identificatore tra virgolette.Valid aliases in Entity SQLEntity SQL are any simple identifier or quoted identifier.

Generazione di aliasAlias Generation

Se viene specificato alcun alias in un Entity SQLEntity SQL , espressione di query Entity SQLEntity SQL tenta di generare un alias in base alle semplici regole seguenti:If no alias is specified in an Entity SQLEntity SQL query expression, Entity SQLEntity SQL tries to generate an alias based on the following simple rules:

  • Se l'espressione di query (per la quale l'alias non è specificato) è un identificatore semplice o delimitato, tale identificatore viene usato come alias.If the query expression (for which the alias is unspecified) is a simple or quoted identifier, that identifier is used as the alias. ROW(a, [b]), ad esempio, diventa ROW(a AS a, [b] AS [b]).For example, ROW(a, [b]) becomes ROW(a AS a, [b] AS [b]).

  • Se l'espressione di query è un'espressione più complessa, ma l'ultimo componente dell'espressione è un identificatore semplice, tale identificatore viene usato come alias.If the query expression is a more complex expression, but the last component of that query expression is a simple identifier, then that identifier is used as the alias. ROW(a.a1, b.[b1]), ad esempio, diventa ROW(a.a1 AS a1, b.[b1] AS [b1]).For example, ROW(a.a1, b.[b1]) becomes ROW(a.a1 AS a1, b.[b1] AS [b1]).

Si consiglia di non usare alias impliciti se successivamente si desidera usare il nome dell'alias.We recommend that you do not use implicit aliasing if you want to use the alias name later. Tutte le volte che gli alias (impliciti o espliciti) sono in conflitto o vengono ripetuti nello stesso ambito, si verifica un errore di compilazione.Anytime aliases (implicit or explicit) conflict or are repeated in the same scope, there will be a compile error. Un alias implicito può essere compilato anche se è presente un alias esplicito o implicito con lo stesso nome.An implicit alias will pass compilation even if there is an explicit or implicit alias of the same name.

Gli alias impliciti vengono generati automaticamente in base all'input dell'utente.Implicit aliases are autogenerated based on user input. La riga di codice seguente consente ad esempio di generare NAME come alias per entrambe le colonne, creando pertanto un conflitto.For example, the following line of code will generate NAME as an alias for both columns and therefore will conflict.

SELECT product.NAME, person.NAME  

Anche la riga di codice seguente, in cui vengono usati alias espliciti, provoca la generazione di un errore.The following line of code, which uses explicit aliases, will also fail. L'errore risulta tuttavia più evidente leggendo il codice.However, the failure will be more apparent by reading the code.

SELECT 1 AS X, 2 AS X …  

Regole di ambitoScoping Rules

Entity SQLEntity SQL definisce le regole di ambito che determinano quando determinate variabili sono visibili nel linguaggio di query. defines scoping rules that determine when particular variables are visible in the query language. Alcune espressioni o istruzioni introducono nuovi nomi.Some expressions or statements introduce new names. Le regole di ambito determinano dove possono essere usati tali nomi, nonché quando o dove una nuova dichiarazione con lo stesso nome di un'altra può nascondere il relativo predecessore.The scoping rules determine where those names can be used, and when or where a new declaration with the same name as another can hide its predecessor.

Quando i nomi vengono definiti un Entity SQLEntity SQL query, si dice che vengono definiti in un ambito.When names are defined in an Entity SQLEntity SQL query, they are said to be defined within a scope. Un ambito include l'intera area della query.A scope covers an entire region of the query. I nomi definiti in un ambito sono visibili per tutte le espressioni o i riferimenti ai nomi inclusi in tale ambito.All expressions or name references within a certain scope can see names that are defined within that scope. Prima dell'inizio di un ambito e dopo la sua fine, non è possibile fare riferimento ai nomi definiti nell'ambito.Before a scope begins and after it ends, names that are defined within the scope cannot be referenced.

Gli ambiti possono essere annidati.Scopes can be nested. Parti di Entity SQLEntity SQL introducono nuovi ambiti che coprono intere aree e tali aree possono contenere altri Entity SQLEntity SQL espressioni che introducono anche gli ambiti.Parts of Entity SQLEntity SQL introduce new scopes that cover entire regions, and these regions can contain other Entity SQLEntity SQL expressions that also introduce scopes. Quando gli ambiti sono annidati, è possibile fare riferimento ai nomi definiti nell'ambito più interno, che contiene il riferimento.When scopes are nested, references can be made to names that are defined in the innermost scope, which contains the reference. È inoltre possibile fare riferimento a qualsiasi nome definito in qualsiasi ambito esterno.References can also be made to any names that are defined in any outer scopes. Due ambiti qualsiasi definiti all'interno dello stesso ambito sono considerati ambiti di pari livello.Any two scopes defined within the same scope are considered sibling scopes. Non è possibile fare riferimento ai nomi definiti in ambiti di pari livello.References cannot be made to names that are defined within sibling scopes.

Se un nome dichiarato in un ambito interno corrisponde a un nome dichiarato in un ambito esterno, i riferimenti nell'ambito interno o negli ambiti dichiarati all'interno di tale ambito riguardano solo il nome appena dichiarato.If a name declared in an inner scope matches a name declared in an outer scope, references within the inner scope or within scopes declared within that scope refer only to the newly declared name. Il nome nell'ambito esterno è nascosto.The name in the outer scope is hidden.

Anche all'interno dello stesso ambito non è possibile fare riferimento ai nomi prima che vengano definiti.Even within the same scope, names cannot be referenced before they are defined.

I nomi globali possono esistere come parte dell'ambiente di esecuzione.Global names can exist as part of the execution environment. Sono inclusi nomi di variabili di ambiente o raccolte persistenti.This can include names of persistent collections or environment variables. Per essere globale, un nome deve essere dichiarato nell'ambito più esterno.For a name to be global, it must be declared in the outermost scope.

I parametri non sono inclusi in un ambito.Parameters are not in a scope. Poiché i riferimenti ai parametri includono una sintassi speciale, i nomi di parametri non sono mai in conflitto con gli altri nomi nella query.Because references to parameters include special syntax, names of parameters will never collide with other names in the query.

Espressioni di queryQuery Expressions

Un Entity SQLEntity SQL query espressione introduce un nuovo ambito.An Entity SQLEntity SQL query expression introduces a new scope. I nomi definiti nella clausola FROM vengono introdotti nell'ambito FROM in base all'ordine con cui appaiono, da sinistra verso destra.Names that are defined in the FROM clause are introduced into the from scope in order of appearance, left to right. Nell'elenco di join, le espressioni possono fare riferimento ai nomi definiti precedentemente nell'elenco.In the join list, expressions can refer to names that were defined earlier in the list. Le proprietà pubbliche (campi e così via) degli elementi identificati nella clausola FROM non vengono aggiunte all'ambito FROM.Public properties (fields and so on) of elements identified in the FROM clause are not added to the from-scope. Per fare riferimento a queste proprietà è sempre necessario usare il nome completo dell'alias.They must be always referenced by the alias-qualified name. In genere, tutte le parti dell'espressione SELECT vengono considerate all'interno dell'ambito FROM.Typically, all parts of the SELECT expression are considered within the from-scope.

La clausola GROUP BY introduce inoltre un nuovo ambito di pari livello.The GROUP BY clause also introduces a new sibling scope. Ogni gruppo può avere un nome che fa riferimento alla raccolta di elementi nel gruppo.Each group can have a group name that refers to the collection of elements in the group. Ogni espressione di raggruppamento introduce inoltre un nuovo nome nell'ambito GROUP.Each grouping expression will also introduce a new name into the group-scope. Viene inoltre eseguita l'aggiunta all'ambito dell'aggregazione annidata o del gruppo denominato.Additionally, the nest aggregate (or the named group) is also added to the scope. Le espressioni di raggruppamento si trovano all'interno dell'ambito FROM.The grouping expressions themselves are within the from-scope. Quando tuttavia viene usata una clausola GROUP BY, l'elenco SELECT (proiezione), la clausola HAVING e la clausola ORDER BY sono considerati inclusi nell'ambito GROUP e non nell'ambito FROM.However, when a GROUP BY clause is used, the select-list (projection), HAVING clause, and ORDER BY clause are considered to be within the group-scope, and not the from-scope. Per le aggregazioni viene usata una modalità di gestione speciale, come descritto nel seguente elenco puntato.Aggregates receive special treatment, as described in the following bulleted list.

Di seguito sono riportate alcune note aggiuntive relative agli ambiti:The following are additional notes about scopes:

  • L'elenco SELECT può introdurre nuovi nomi nell'ambito, in ordine.The select-list can introduce new names into the scope, in order. Le espressioni di proiezione a destra possono riferirsi ai nomi proiettati a sinistra.Projection expressions to the right might refer to names projected on the left.

  • La clausola ORDER BY può fare riferimento a nomi (alias) specificati nell'elenco SELECT.The ORDER BY clause can refer to names (aliases) specified in the select list.

  • L'ordine di valutazione delle clausole nell'espressione SELECT determina l'ordine con cui i nomi vengono introdotti nell'ambito.The order of evaluation of clauses within the SELECT expression determines the order that names are introduced into the scope. La clausola FROM viene valutata per prima, seguita dalle clausole WHERE, GROUP BY, HAVING, SELECT e infine ORDER BY.The FROM clause is evaluated first, followed by the WHERE clause, GROUP BY clause, HAVING clause, SELECT clause, and finally the ORDER BY clause.

Gestione delle aggregazioniAggregate Handling

Entity SQLEntity SQL supporta due forme di aggregazione: aggregazioni basate sulle raccolte e aggregazioni basate su gruppo. supports two forms of aggregates: collection-based aggregates and group-based aggregates. Le aggregazioni basate sulle raccolte rappresentano il costrutto preferito in Entity SQLEntity SQL, mentre quelle basate sui gruppi sono supportate per offrire compatibilità con SQL.Collection-based aggregates are the preferred construct in Entity SQLEntity SQL, and group-based aggregates are supported for SQL compatibility.

Quando si risolve un'aggregazione, Entity SQLEntity SQL tenta innanzitutto di considerarlo come una funzione di aggregazione basate sulle raccolte.When resolving an aggregate, Entity SQLEntity SQL first tries to treat it as a collection-based aggregate. Se il problema persiste, Entity SQLEntity SQL Trasforma l'input di aggregazione in un riferimento all'aggregazione annidata e tenta di risolvere questa nuova espressione, come illustrato nell'esempio seguente.If that fails, Entity SQLEntity SQL transforms the aggregate input into a reference to the nest aggregate and tries to resolve this new expression, as illustrated in the following example.

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

Vedere ancheSee Also

Riferimento a Entity SQLEntity SQL Reference
Panoramica di Entity SQLEntity SQL Overview
Set di caratteri di inputInput Character Set