Forma degli alberi dei comandiThe Shape of the Command Trees

Il modulo di generazione SQL è responsabile della generazione di una query SQL specifica di back-end basata su una determinata espressione dell'albero dei comandi della query di input.The SQL generation module is responsible for generating a backend specific SQL query based on a given input query command tree expression. Questa sezione descrive le caratteristiche, le proprietà e la forma degli alberi dei comandi di query.This section discusses the characteristics, properties, and structure of the query command trees.

Panoramica degli alberi dei comandi di queryQuery Command Trees Overview

Un albero dei comandi di query è una rappresentazione del modello a oggetti di una query.A query command tree is an object model representation of a query. Tali alberi dei comandi di query hanno due funzioni:Query command trees serve two purposes:

  • Esprimere una query di input specificata per Entity FrameworkEntity Framework.To express an input query that is specified against the Entity FrameworkEntity Framework.

  • Esprimere una query di output specificata per un provider, che descrive una query sul back-end.To express an output query that is given to a provider and describes a query against the backend.

Gli alberi dei comandi di query supportano una semantica più completa rispetto alle query conformi a SQL:1999, che include il supporto per l'uso di raccolte annidate e l'esecuzione di operazioni sui tipi, ad esempio quelle per verificare se un'entità è di un determinato tipo o filtrare i set in base a un tipo.Query command trees support richer semantics than SQL:1999 compliant queries, including support for working with nested collections and type operations, like checking whether an entity is of a particular type, or filtering sets based on a type.

La proprietà DBQueryCommandTree.Query è la radice dell'albero delle espressioni che descrive la logica della query.The DBQueryCommandTree.Query property is the root of the expression tree that describes the query logic. La proprietà DBQueryCommandTree.Parameters contiene un elenco di parametri usati nella query.The DBQueryCommandTree.Parameters property contains a list of parameters that are used in the query. L'albero delle espressioni è costituito da oggetti DbExpression.The expression tree is composed of DbExpression objects.

Un oggetto DbExpression rappresenta un'attività di calcolo.A DbExpression object represents some computation. In Entity FrameworkEntity Framework sono disponibili diversi tipi di espressione per la creazione di espressioni di query, incluse costanti, variabili, funzioni, costruttori e operatori relazionali standard come gli operatori di filtro e join.Several kinds of expressions are provided by the Entity FrameworkEntity Framework for composing query expressions, including constants, variables, functions, constructors, and standard relational operators like filter and join. Ogni oggetto DbExpression include una proprietà ResultType che rappresenta il tipo del risultato prodotto dall'espressione.Every DbExpression object has a ResultType property that represents the type of the result produced by that expression. Questo tipo viene espresso come TypeUsage.This type is expressed as a TypeUsage.

Forme dell'albero dei comandi di query di outputShapes of the Output Query Command Tree

Gli alberi dei comandi di query di output rappresentano in modo accurato query SQL relazionali e rispettano regole più rigorose rispetto a quelle applicate agli alberi dei comandi di query.Output query command trees closely represent relational (SQL) queries and adhere to much stricter rules than those that apply to query command trees. Contengono in genere costrutti che vengono convertiti facilmente in SQL.They typically contain constructs that are easily translated to SQL.

Gli alberi dei comandi di input vengono espresse in base al modello concettuale, che supporta proprietà di navigazione, associazioni tra entità ed ereditarietà.Input command trees are expressed against the conceptual model, which supports navigation properties, associations among entities, and inheritance. Gli alberi dei comandi di output vengono espresse in base al modello di archiviazione.Output command trees are expressed against the storage model. Diversamente da questi ultimi, gli alberi dei comandi di input consentono di proiettare raccolte annidate.Input command trees allow you to project nested collections, but output command trees do not.

Gli alberi dei comandi di query di output vengono compilati usando un subset degli oggetti DbExpression disponibili, che contiene alcune espressioni con un utilizzo limitato.Output query command trees are built using a subset of the available DbExpression objects and even some expressions in that subset have restricted usage.

Le operazioni sui tipi, ad esempio quelle per verificare se una determinata espressione è di un tipo specifico o filtrare i set in base a un tipo, non sono presenti negli alberi dei comandi di output.Type operations, like checking whether a given expression is of a particular type or filtering sets based on a type, are not present in output command trees.

Negli alberi dei comandi di output solo le espressioni che restituiscono valori booleani vengono usate per le proiezioni e solo per i predicati nelle espressioni che richiedono un predicato, ad esempio un'istruzione Case o per il filtro.In output command trees, only expressions that return Boolean values are used for projections and only for predicates in expressions requiring a predicate, like a filter or a case statement.

La radice degli alberi dei comandi di query di output è un oggetto DbProjectExpression.The root of an output query command trees is a DbProjectExpression object.

Tipi di espressione non inclusi negli alberi dei comandi di query di outputExpression Types Not Present in Output Query Command Trees

I tipi di espressione seguenti non sono validi in un albero dei comandi di query di output e non devono essere gestiti dai provider:The following expression types are not valid in an output query command tree and do not need to be handled by providers:

DbDerefExpressionDbDerefExpression

DbEntityRefExpressionDbEntityRefExpression

DbRefKeyExpressionDbRefKeyExpression

DbIsOfExpressionDbIsOfExpression

DbOfTypeExpressionDbOfTypeExpression

DbRefExpressionDbRefExpression

DbRelationshipNavigationExpressionDbRelationshipNavigationExpression

DbTreatExpressionDbTreatExpression

Restrizioni e note relative alle espressioniExpression Restrictions and Notes

Molte espressioni possono essere usate solo in modo limitato negli alberi dei comandi di query di output:Many expressions can only be used in a restricted manner in output query command trees:

DbFunctionExpressionDbFunctionExpression

È possibile passare i tipi di funzione seguenti:The following function types can be passed:

  • Funzioni canoniche riconosciute dallo spazio dei nomi Edm.Canonical functions that are recognized by the Edm namespace.

  • Funzioni di archivio predefinite riconosciute da BuiltInAttribute.Built-in (store) functions that are recognized by the BuiltInAttribute.

  • Funzioni definite dall'utente.User-defined functions.

Funzioni canoniche (vedere funzioni canoniche per ulteriori informazioni) vengono specificati come parte di Entity FrameworkEntity Framework, e i provider devono fornire le implementazioni per le funzioni canoniche in base a tali specifiche.Canonical functions (see Canonical Functions for more information) are specified as part of the Entity FrameworkEntity Framework, and providers should supply implementations for canonical functions based on those specifications. Le funzioni di archivio si basano sulle specifiche contenute nel file manifesto del provider corrispondente.Store functions are based on the specifications in the corresponding provider manifest. Le funzioni definite dall'utente si basano sulle specifiche di SSDL.User defined functions are based on specifications in the SSDL.

Inoltre, le funzioni che includono l'attributo NiladicFunction non dispongono di argomenti e devono essere convertite senza la parentesi finale,Also, functions having the NiladicFunction attribute have no arguments and should be translated without the parenthesis at the end. Vale a dire, a <functionName > anziché <functionName > ().That is, to <functionName> instead of <functionName>().

DbNewInstanceExpressionDbNewInstanceExpression

DbNewInstanceExpression può essere specificato solo nei due casi seguenti:DbNewInstanceExpression can only occur in the following two cases:

  • Come proprietà Projection di DbProjectExpression.As the Projection property of DbProjectExpression. In questo caso, vengono applicate le restrizioni seguenti:When used as such the following restrictions apply:

    • Il risultato deve essere un tipo di riga.The result type must be a row type.

    • I relativi argomenti devono essere espressioni che producono un risultato con un tipo primitivo.Each of its arguments is an expression that produces a result with a primitive type. In genere, ogni argomento è un'espressione scalare, ad esempio un oggetto PropertyExpression su un oggetto DbVariableReferenceExpression, una chiamata a una funzione o un calcolo aritmetico di DbPropertyExpression su un oggetto DbVariableReferenceExpression o una chiamata a una funzione.Typically, each argument is a scalar expression, like a PropertyExpression over a DbVariableReferenceExpression, a function invocation, or an arithmetic computation of the DbPropertyExpression over a DbVariableReferenceExpression or a function invocation. È tuttavia possibile specificare un'espressione che rappresenta una subquery scalare anche nell'elenco di argomenti di un oggetto DbNewInstanceExpression.However, an expression representing a scalar subquery can also occur in the list of arguments for a DbNewInstanceExpression. Un'espressione che rappresenta una subquery scalare è un albero delle espressioni che rappresenta una subquery che restituisce esattamente una riga e una colonna di un tipo primitivo con una radice dell'oggetto DbElementExpression.An expression that represents a scalar subquery is an expression tree that represents a subquery that returns exactly one row and one column of a primitive type with a DbElementExperession object root

  • Con un tipo restituito di raccolta, nel qual caso definisce una nuova raccolta delle espressioni specificate come argomenti.With a collection return type, in which case it defines a new collection of the expressions provided as arguments.

DbVariableReferenceExpressionDbVariableReferenceExpression

Un oggetto DbVariableReferenceExpression deve essere un elemento figlio del nodo DbPropertyExpression.A DbVariableReferenceExpression has to be a child of DbPropertyExpression node.

DbGroupByExpressionDbGroupByExpression

La proprietà Aggregates di un oggetto DbGroupByExpression può presentare solo elementi di tipo DbFunctionAggregate.The Aggregates property of a DbGroupByExpression can only have elements of type DbFunctionAggregate. Non esistono altri tipi di aggregazione.There are no other aggregate types.

DbLimitExpressionDbLimitExpression

La proprietà Limit può essere solo un oggetto DbConstantExpression o DbParameterReferenceExpression.The property Limit can only be a DbConstantExpression or a DbParameterReferenceExpression. Inoltre, la proprietà WithTies è sempre false in .NET Framework 3.5 e versioni precedenti.Also property WithTies is always false as of version 3.5 of the .NET Framework.

DbScanExpressionDbScanExpression

Quando viene usato negli alberi dei comandi di output, DbScanExpression rappresenta in modo efficiente un'analisi di una query di tabella, visualizzazione o archivio, rappresentata da EnitySetBase::Target.When used in output command trees, the DbScanExpression effectively represents a scan over a table, a view, or a store query, represented by EnitySetBase::Target.

Se la proprietà dei metadati "Definizione di Query" della destinazione è diverso da null, rappresenta una query, il testo della query per cui viene fornito nella proprietà dei metadati in linguaggio specifico del provider (o un dialetto) come specificato nella definizione dello schema di archivio.If the metadata property "Defining Query" of the target is non-null, then it represents a query, the query text for which is provided in that metadata property in the provider’s specific language (or dialect) as specified in the store schema definition.

In caso contrario, la destinazione rappresenta una tabella o una visualizzazione.Otherwise, the target represents a table or a view. Il prefisso di schema si trova nella proprietà dei metadati "Schema", in caso contrario, null, in caso contrario è il nome del contenitore di entità.Its schema prefix is either in the "Schema" metadata property, if not null, otherwise is the entity container name. Il nome di tabella o vista è alla proprietà dei metadati "Table", se non è null, in caso contrario la proprietà Name dell'entità di base del set.The table or view name is either the "Table" metadata property, if not null, otherwise the Name property of the entity set base.

Tutte queste proprietà hanno origine dalla definizione dell'EntitySet corrispondente nel file SSDL (Store Schema Definition Language).All these properties originate from the definition of the corresponding EntitySet in the store schema definition file (the SSDL).

Utilizzo dei tipi primitiviUsing Primitive Types

Quando si fa riferimento ai tipi primitivi negli alberi dei comandi di output, in genere il riferimento è contenuto nei tipi primitivi del modello concettuale.When primitive types are referenced in output command trees, they are typically referenced in the conceptual model's primitive types. Per determinate espressioni, tuttavia, i, provider richiedono il tipo primitivo dell'archivio corrispondente.However, for certain expressions, providers need the corresponding store primitive type. Esempi di tali espressioni includono DbCastExpression e in alcuni casi DbNullExpression, se il provider deve eseguire il cast del valore null al tipo corrispondente.Examples of such expressions include DbCastExpression and possibly DbNullExpression, if the provider needs to cast the null to the corresponding type. In questi casi, i provider devono eseguire il mapping al tipo di provider in base al tipo primitivo e ai relativi facet.In these cases, providers should do the mapping to the provider type based on the primitive type kind and its facets.

Vedere ancheSee Also

Generazione SQLSQL Generation