Conversione dell'operatore query standardStandard Query Operator Translation

Gli operatori di query standard vengono convertiti in comandi SQL in LINQ to SQLLINQ to SQL.LINQ to SQLLINQ to SQL translates Standard Query Operators to SQL commands. Il processore di query del database determina la semantica di esecuzione della conversione SQL.The query processor of the database determines the execution semantics of SQL translation.

Gli operatori Query standard definiti in sequenze.Standard Query Operators are defined against sequences. È una sequenza ordinati e si basa sull'identità del riferimento per ogni elemento della sequenza.A sequence is ordered and relies on reference identity for each element of the sequence. Per ulteriori informazioni, vedere Cenni preliminari sugli operatori di Query Standard.For more information, see Standard Query Operators Overview.

SQL vengono principalmente gestiti insiemi di valori non ordinati.SQL deals primarily with unordered sets of values. L'ordinamento è in genere un'operazione di post-elaborazione specificata in modo esplicito, che viene applicata al risultato finale di una query piuttosto che ai risultati intermedi.Ordering is typically an explicitly stated, post-processing operation that is applied to the final result of a query rather than to intermediate results. L'identità viene definita dai valori.Identity is defined by values. Per questo motivo, le query SQL vengono riconosciute come multiset (sacchetti) anziché imposta.For this reason, SQL queries are understood to deal with multisets (bags) instead of sets.

Nei paragrafi seguenti vengono descritte le differenze tra gli operatori di query standard e la relativa conversione SQL per il provider SQL Server per LINQ to SQLLINQ to SQL.The following paragraphs describe the differences between the Standard Query Operators and their SQL translation for the SQL Server provider for LINQ to SQLLINQ to SQL.

Supporto degli operatoriOperator Support

ConcatConcat

Il metodo Concat viene definito per multiset ordinati in cui l'ordine del ricevente e l'ordine dell'argomento sono uguali.The Concat method is defined for ordered multisets where the order of the receiver and the order of the argument are the same. Il funzionamento di Concat sui multiset seguiti dall'ordine comune è analogo a quello di UNION ALL.Concat works as UNION ALL over the multisets followed by the common order.

Il passaggio finale in SQL consiste nell'ordinamento prima che vengano generati i risultati.The final step is ordering in SQL before results are produced. Concat non mantiene l'ordine degli argomenti.Concat does not preserve the order of its arguments. Per assicurare che l'ordine sia appropriato, è necessario ordinare i risultati di Concat in modo esplicito.To ensure appropriate ordering, you must explicitly order the results of Concat.

Metodi Intersect, Except, UnionIntersect, Except, Union

I metodi Intersect e Except sono definiti correttamente solo sui set,The Intersect and Except methods are well defined only on sets. mentre la semantica per i tipi multiset non è definita.The semantics for multisets is undefined.

Il metodo Union viene definito per i tipi multiset come concatenazione non ordinata di multiset, che corrisponde in effetti al risultato della clausola UNION ALL in SQL.The Union method is defined for multisets as the unordered concatenation of the multisets (effectively the result of the UNION ALL clause in SQL).

Metodi Take, SkipTake, Skip

Take e Skip metodi sono definiti correttamente solo sugli set ordinati.Take and Skip methods are well defined only against ordered sets. mentre la semantica per i set non ordinati o i tipi multiset non è definita.The semantics for unordered sets or multisets are undefined.

Nota

Take e Skip presentano alcune limitazioni quando vengono usati nelle query su SQL Server 2000.Take and Skip have certain limitations when they are used in queries against SQL Server 2000. Per ulteriori informazioni, vedere la voce "Skip e Take eccezioni in SQL Server 2000" in risoluzione dei problemi.For more information, see the "Skip and Take Exceptions in SQL Server 2000" entry in Troubleshooting.

A causa delle limitazioni relative all'ordinamento in SQL, LINQ to SQLLINQ to SQL tenta di spostare l'ordinamento dell'argomento di questi metodi per il risultato del metodo.Because of limitations on ordering in SQL, LINQ to SQLLINQ to SQL tries to move the ordering of the argument of these methods to the result of the method. Si consideri ad esempio la seguente query LINQ to SQLLINQ to SQL:For example, consider the following LINQ to SQLLINQ to SQL query:

var custQuery = 
    (from cust in db.Customers
    where cust.City == "London"
    orderby cust.CustomerID
    select cust).Skip(1).Take(1);
Dim custQuery = _
    From cust In db.Customers _
    Where cust.City = "London" _
    Order By cust.CustomerID _
    Select cust Skip 1 Take 1

L'SQL generato per questo codice sposta l'ordinamento alla fine, come segue:The generated SQL for this code moves the ordering to the end, as follows:

SELECT TOP 1 [t0].[CustomerID], [t0].[CompanyName],  
FROM [Customers] AS [t0]  
WHERE (NOT (EXISTS(  
    SELECT NULL AS [EMPTY]  
    FROM (  
        SELECT TOP 1 [t1].[CustomerID]  
        FROM [Customers] AS [t1]  
        WHERE [t1].[City] = @p0  
        ORDER BY [t1].[CustomerID]  
        ) AS [t2]  
    WHERE [t0].[CustomerID] = [t2].[CustomerID]  
    ))) AND ([t0].[City] = @p1)  
ORDER BY [t0].[CustomerID]  

È quindi evidente che quando Take e Skip vengono concatenati, tutto l'ordinamento specificato deve essere coerente.It becomes obvious that all the specified ordering must be consistent when Take and Skip are chained together. In caso contrario i risultati non saranno definiti.Otherwise, the results are undefined.

Sia Take che Skip sono definiti correttamente per gli argomenti di tipo integrale costante non negativi basati sulla specifica dell'operatore di query standard.Both Take and Skip are well-defined for non-negative, constant integral arguments based on the Standard Query Operator specification.

Operatori senza conversioneOperators with No Translation

I metodi seguenti non vengono convertiti da LINQ to SQLLINQ to SQL.The following methods are not translated by LINQ to SQLLINQ to SQL. Il motivo più comune è la differenza tra i multiset non ordinati e le sequenze.The most common reason is the difference between unordered multisets and sequences.

OperatoriOperators Spiegazione logica:Rationale
TakeWhile, SkipWhileTakeWhile, SkipWhile Le query SQL vengono eseguite su multiset, non su sequenze.SQL queries operate on multisets, not on sequences. ORDER BY deve essere l'ultima clausola applicata ai risultati.ORDER BY must be the last clause applied to the results. Per questo motivo non esiste una conversione di tipo generico per questi due metodi.For this reason, there is no general-purpose translation for these two methods.
Reverse La conversione di questo metodo è possibile per un set ordinato, ma attualmente non viene eseguita da LINQ to SQLLINQ to SQL.Translation of this method is possible for an ordered set but is not currently translated by LINQ to SQLLINQ to SQL.
Last, LastOrDefaultLast, LastOrDefault La conversione di questi metodi è possibile per un set ordinato, ma attualmente non viene eseguita da LINQ to SQLLINQ to SQL.Translation of these methods is possible for an ordered set but is not currently translated by LINQ to SQLLINQ to SQL.
ElementAt, ElementAtOrDefaultElementAt, ElementAtOrDefault Le query SQL vengono eseguite su multiset, non sulle sequenze indicizzabili.SQL queries operate on multisets, not on indexable sequences.
DefaultIfEmpty (overload con argomento predefinito)DefaultIfEmpty (overload with default arg) In generale non è possibile specificare un valore predefinito per una tupla arbitraria.In general, a default value cannot be specified for an arbitrary tuple. In alcuni casi i valori null per le tuple sono consentiti tramite outer join.Null values for tuples are possible in some cases through outer joins.

Conversione di espressioneExpression Translation

Semantica nullNull semantics

LINQ to SQLLINQ to SQL non impone la semantica di confronto in SQL. does not impose null comparison semantics on SQL. Gli operatori di confronto vengono sintatticamente convertiti negli equivalenti SQL.Comparison operators are syntactically translated to their SQL equivalents. Per questo motivo la semantica riflette la semantica SQL definita nelle impostazioni di connessione o del server.For this reason, the semantics reflect SQL semantics that are defined by server or connection settings. Ad esempio, due valori null sono considerati non uguali nelle impostazioni predefinite di SQL Server, ma è possibile modificare le impostazioni per modificare la semantica.For example, two null values are considered unequal under default SQL Server settings, but you can change the settings to change the semantics. In LINQ to SQLLINQ to SQL non vengono considerate le impostazioni del server durante la conversione delle query.LINQ to SQLLINQ to SQL does not consider server settings when it translates queries.

Un confronto con il valore letterale null viene convertito nella versione SQL appropriata (is null o is not null).A comparison with the literal null is translated to the appropriate SQL version (is null or is not null).

Il valore null nelle regole di confronto viene definito da SQL Server.The value of null in collation is defined by SQL Server. LINQ to SQLLINQ to SQL non modifica le regole di confronto. does not change the collation.

AggregatiAggregates

Il metodo di aggregazione dell'operatore di query standard Sum restituisce valori zero per tutte le sequenze vuote o che contengono solo valori null.The Standard Query Operator aggregate method Sum evaluates to zero for an empty sequence or for a sequence that contains only nulls. In LINQ to SQLLINQ to SQL, la semantica di SQL rimane invariata, e Sum restituisce null anziché zero per una sequenza vuota o una sequenza che contiene solo valori null.In LINQ to SQLLINQ to SQL, the semantics of SQL are left unchanged, and Sum evaluates to null instead of zero for an empty sequence or for a sequence that contains only nulls.

Le limitazioni di SQL sui risultati intermedi vengono applicate agli aggregati in LINQ to SQLLINQ to SQL.SQL limitations on intermediate results apply to aggregates in LINQ to SQLLINQ to SQL. La somma, Sum, delle quantità di valori integer a 32 bit non viene calcolata utilizzando risultati a 64 bitThe Sum of 32-bit integer quantities is not computed by using 64-bit results. ed è possibile che si verifichi un overflow per una conversione LINQ to SQLLINQ to SQL di Sum, anche se l'implementazione dell'operatore di query standard non provoca un overflow per la corrispondente sequenza in memoria.Overflow might occur for a LINQ to SQLLINQ to SQL translation of Sum, even if the Standard Query Operator implementation does not cause an overflow for the corresponding in-memory sequence.

In modo analogo la conversione LINQ to SQLLINQ to SQL di Average di valori integer viene calcolata come un valore integer, non come un valore double.Likewise, the LINQ to SQLLINQ to SQL translation of Average of integer values is computed as an integer, not as a double.

Argomenti di entitàEntity Arguments

LINQ to SQLLINQ to SQL consente ai tipi di entità da utilizzare nel GroupBy e OrderBy metodi. enables entity types to be used in the GroupBy and OrderBy methods. Nella conversione di tali operatori l'uso di un argomento di un tipo viene considerato equivalente della specifica di tutti i membri di quel tipo.In the translation of these operators, the use of an argument of a type is considered to be the equivalent to specifying all members of that type. Ad esempio, il codice seguente è equivalente.For example, the following code is equivalent:

db.Customers.GroupBy(c => c);
db.Customers.GroupBy(c => new { c.CustomerID, c.ContactName });
db.Customers.GroupBy(Function(c) c)
db.Customers.GroupBy(Function(c) New With {c.CustomerID, _
    c.ContactName})

Argomenti di uguaglianza/confrontoEquatable / Comparable Arguments

Nell'implementazione dei metodi elencati di seguito è richiesta l'uguaglianza di argomenti:Equality of arguments is required in the implementation of the following methods:

Contains

Skip

Union

Intersect

Except

LINQ to SQLLINQ to SQL supporta uguaglianza e confronto per flat argomenti, ma non per gli argomenti sono o che contengono le sequenze. supports equality and comparison for flat arguments, but not for arguments that are or contain sequences. Un argomento non strutturato è un tipo di cui è possibile eseguire il mapping a una riga SQL.A flat argument is a type that can be mapped to a SQL row. Una proiezione di uno o più tipi di entità, per cui è possibile determinare staticamente che non è presente una sequenza, viene considerata un argomento non strutturato.A projection of one or more entity types that can be statically determined not to contain a sequence is considered a flat argument.

Di seguito sono riportati esempi di argomenti non strutturati:Following are examples of flat arguments:

db.Customers.Select(c => c);
db.Customers.Select(c => new { c.CustomerID, c.City });
db.Orders.Select(o => new { o.OrderID, o.Customer.City });
db.Orders.Select(o => new { o.OrderID, o.Customer });	
db.Customers.Select(Function(c) c)
db.Customers.Select(Function(c) New With {c.CustomerID, c.City})
db.Orders.Select(Function(o) New With {o.OrderID, o.Customer.City})
db.Orders.Select(Function(o) New With {o.OrderID, o.Customer})

Gli esempi seguenti si riferiscono ad argomenti strutturati (gerarchici).The following are examples of non-flat (hierarchical) arguments.

// In the following line, c.Orders is a sequence.
db.Customers.Select(c => new { c.CustomerID, c.Orders });
// In the following line, the result has a sequence.
db.Customers.GroupBy(c => c.City);
' In the following line, c.Orders is a sequence.
db.Customers.Select(Function(c) New With {c.CustomerID, c.Orders})
' In the following line, the result has a sequence.
db.Customers.GroupBy(Function(c) c.City)

Conversione di funzioni Visual BasicVisual Basic Function Translation

Le seguenti funzioni di supporto usate dal compilatore Visual Basic vengono convertite nei corrispondenti operatori e funzioni SQL:The following helper functions that are used by the Visual Basic compiler are translated to corresponding SQL operators and functions:

CompareString

DateTime.Compare

Decimal.Compare

IIf (in Microsoft.VisualBasic.Interaction)

Metodi di conversione:Conversion methods:

ToBooleanToBoolean ToSByteToSByte ToByteToByte ToCharToChar
ToCharArrayRankOneToCharArrayRankOne ToDateToDate ToDecimalToDecimal ToDoubleToDouble
ToIntegerToInteger ToUIntegerToUInteger ToLongToLong ToULongToULong
ToShortToShort ToUShortToUShort ToSingleToSingle ToStringToString

Supporto dell'ereditarietàInheritance Support

Limitazioni relative al mapping di ereditarietàInheritance Mapping Restrictions

Per ulteriori informazioni, vedere come: mappa di gerarchie di ereditarietà.For more information, see How to: Map Inheritance Hierarchies.

Ereditarietà nelle queryInheritance in Queries

I cast C# sono supportati solo nella proiezione.C# casts are supported only in projection. I cast usati in altri contesti non vengono convertiti e sono ignorati.Casts that are used elsewhere are not translated and are ignored. A parte i nomi delle funzioni SQL, in SQL viene in effetti eseguito solo l'equivalente dell'operazione Convert di Common Language Runtime (CLR).Aside from SQL function names, SQL really only performs the equivalent of the common language runtime (CLR) Convert. In altre parole SQL è in grado di modificare il valore di un tipo in un altro.That is, SQL can change the value of one type to another. Non è disponibile un cast CLR equivalente, in quanto non esiste un concetto che consenta di reinterpretare gli stessi bit di un altro tipo.There is no equivalent of CLR cast because there is no concept of reinterpreting the same bits as those of another type. Per questo motivo un cast C# funziona solo localmenteThat is why a C# cast works only locally. e non viene usato in modalità remota.It is not remoted.

Gli operatori is e as e il metodo GetType non sono limitati all'operatore Select,The operators, is and as, and the GetType method are not restricted to the Select operator. pertanto possono essere usati anche in altri operatori di query.They can be used in other query operators also.

Supporto di SQL Server 2008SQL Server 2008 Support

A partire da .NET Framework versione 3.5 SP1, LINQ to SQL supporta il mapping ai nuovi tipi di data e ora introdotti con SQL Server 2008.Starting with the .NET Framework 3.5 SP1, LINQ to SQL supports mapping to new date and time types introduced with SQL Server 2008. Vi sono tuttavia alcune limitazioni relative agli operatori di query LINQ to SQL che è possibile usare quando si lavora con valori mappati a questi nuovi tipi.But, there are some limitations to the LINQ to SQL query operators that you can use when operating against values mapped to these new types.

Operatori di query non supportatiUnsupported Query Operators

Gli operatori di query seguenti non sono supportati per i valori mappati ai nuovi tipi di data e ora SQL Server: DATETIME2, DATE, TIME e DATETIMEOFFSET.The following query operators are not supported on values mapped to the new SQL Server date and time types: DATETIME2, DATE, TIME, and DATETIMEOFFSET.

  • Aggregate

  • Average

  • LastOrDefault

  • OfType

  • Sum

Per ulteriori informazioni sul mapping di questi tipi di data e ora di SQL Server, vedere Mapping dei tipi CLR SQL.For more information about mapping to these SQL Server date and time types, see SQL-CLR Type Mapping.

Supporto di SQL Server 2005SQL Server 2005 Support

LINQ to SQLLINQ to SQL non supporta le seguenti funzionalità di SQL Server 2005: does not support the following SQL Server 2005 features:

  • Stored procedure scritte per CLR SQL.Stored procedures written for SQL CLR.

  • Tipo definito dall'utente.User-defined type.

  • Funzionalità di query XML.XML query features.

Supporto di SQL Server 2000SQL Server 2000 Support

Le seguenti limitazioni di SQL Server 2000SQL Server 2000, rispetto a Microsoft SQL Server 2005Microsoft SQL Server 2005, influiscono sul supporto di LINQ to SQLLINQ to SQL.The following SQL Server 2000SQL Server 2000 limitations (compared to Microsoft SQL Server 2005Microsoft SQL Server 2005) affect LINQ to SQLLINQ to SQL support.

Operatori Cross Apply e Outer ApplyCross Apply and Outer Apply Operators

Questi operatori non sono disponibili in SQL Server 2000SQL Server 2000.These operators are not available in SQL Server 2000SQL Server 2000. LINQ to SQLLINQ to SQL tenta una serie di operazioni di riscrittura per sostituirli con join appropriati. tries a series of rewrites to replace them with appropriate joins.

Cross Apply e Outer Apply vengono generati per la navigazione tra relazioni.Cross Apply and Outer Apply are generated for relationship navigations. Il set di query per cui tali riscritture sono possibili non è esattamente definito.The set of queries for which such rewrites are possible is not well defined. Per questo motivo il set minimo di query supportato per SQL Server 2000SQL Server 2000 è quello che non comporta la navigazione tra relazioni.For this reason, the minimal set of queries that is supported for SQL Server 2000SQL Server 2000 is the set that does not involve relationship navigation.

text/ntexttext / ntext

Tipi di dati text / ntext non può essere utilizzato in determinate operazioni di query su varchar(max) / nvarchar(max), che sono supportate da Microsoft SQL Server 2005Microsoft SQL Server 2005.Data types text / ntext cannot be used in certain query operations against varchar(max) / nvarchar(max), which are supported by Microsoft SQL Server 2005Microsoft SQL Server 2005.

Non sono disponibili risoluzioni per questa limitazione.No resolution is available for this limitation. In particolare, non è possibile usare Distinct() su qualsiasi risultato contenente membri di cui è stato eseguito il mapping a colonne text o ntext.Specifically, you cannot use Distinct() on any result that contains members that are mapped to text or ntext columns.

Comportamento attivato dalle query annidateBehavior Triggered by Nested Queries

SQL Server 2000SQL Server 2000 (tramite SP4) dello strumento di associazione presenta alcune peculiarità attivate dalle query annidate. (through SP4) binder has some idiosyncrasies that are triggered by nested queries. Il set di query SQL che attiva queste peculiarità non è esattamente definito.The set of SQL queries that triggers these idiosyncrasies is not well defined. Per questo motivo, è possibile definire il set di LINQ to SQLLINQ to SQL query che potrebbero provocare eccezioni di SQL Server.For this reason, you cannot define the set of LINQ to SQLLINQ to SQL queries that might cause SQL Server exceptions.

Operatori Skip e TakeSkip and Take Operators

Take e Skip presentano determinate limitazioni quando vengono usati nelle query su SQL Server 2000SQL Server 2000.Take and Skip have certain limitations when they are used in queries against SQL Server 2000SQL Server 2000. Per ulteriori informazioni, vedere la voce "Skip e Take eccezioni in SQL Server 2000" in risoluzione dei problemi.For more information, see the "Skip and Take Exceptions in SQL Server 2000" entry in Troubleshooting.

Materializzazione di oggettiObject Materialization

La materializzazione crea oggetti CLR da righe restituite da una o più query SQL.Materialization creates CLR objects from rows that are returned by one or more SQL queries.

  • Le chiamate seguenti vengono eseguite localmente come parte dell'operazione di materializzazione:The following calls are executed locally as a part of materialization:

    • CostruttoriConstructors

    • Metodi ToString nelle proiezioniToString methods in projections

    • Cast dei tipi nelle proiezioniType casts in projections

  • I metodi che seguono il AsEnumerable metodo eseguite localmente.Methods that follow the AsEnumerable method are executed locally. Questo metodo non provoca l'esecuzione immediata.This method does not cause immediate execution.

  • È possibile usare struct come tipo restituito del risultato di una query o come un membro del tipo di risultato.You can use a struct as the return type of a query result or as a member of the result type. Le entità devono essere classi.Entities are required to be classes. I tipi anonimi vengono materializzati come istanze della classe, tuttavia gli struct denominati, non le entità, possono essere usati nella proiezione.Anonymous types are materialized as class instances, but named structs (non-entities) can be used in projection.

  • Un membro del tipo restituito del risultato di una query può essere di tipo IQueryable<T>A member of the return type of a query result can be of type IQueryable<T>. e viene materializzato come una raccolta locale.It is materialized as a local collection.

  • I metodi seguenti provocano la materializzazione immediata della sequenza che i metodi vengono applicati a:The following methods cause the immediate materialization of the sequence that the methods are applied to:

Vedere ancheSee Also

RiferimentoReference
Restituire o ignorare elementi in una sequenzaReturn Or Skip Elements in a Sequence
Concatenare due sequenzeConcatenate Two Sequences
Restituire la differenza dei set tra due sequenzeReturn the Set Difference Between Two Sequences
Restituire l'intersezione tra set di due sequenzeReturn the Set Intersection of Two Sequences
Restituire l'unione di set di due sequenzeReturn the Set Union of Two Sequences