Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
LINQ to Entities offre il supporto di query Language-Integrated (LINQ) che consente agli sviluppatori di scrivere query sul modello concettuale di Entity Framework usando Visual Basic o Visual C#. Le query su Entity Framework sono rappresentate dalle query dell'albero dei comandi, eseguite sul contesto dell'oggetto. LINQ to Entities converte Language-Integrated query (LINQ) in query albero dei comandi, esegue le query su Entity Framework e restituisce oggetti che possono essere usati sia da Entity Framework che da LINQ. Di seguito è riportato il processo di creazione ed esecuzione di una query LINQ to Entities:
Costruire un'istanza ObjectQuery<T> da ObjectContext.
Comporre una query LINQ to Entities in C# o Visual Basic usando l'istanza ObjectQuery<T> di .
Convertire gli operatori e le espressioni di query standard LINQ in alberi dei comandi.
Eseguire la query, nella rappresentazione ad albero dei comandi, sull'origine dati. Tutte le eccezioni generate nell'origine dati durante l'esecuzione vengono passate direttamente al client.
Restituire i risultati della query al client.
Costruzione di un'istanza objectQuery
La ObjectQuery<T> classe generica rappresenta una query che restituisce una raccolta di zero o più entità tipate. Una query di oggetto viene in genere costruita da un contesto di oggetto esistente, invece di essere costruita manualmente e appartiene sempre al contesto dell'oggetto. Questo contesto fornisce le informazioni di connessione e metadati necessarie per comporre ed eseguire la query. La ObjectQuery<T> classe generica implementa l'interfaccia IQueryable<T> generica, i cui metodi di generatore consentono la compilazione incrementale delle query LINQ. È anche possibile consentire al compilatore di dedurre il tipo di entità usando la parola chiave C# var
(Dim
in Visual Basic, con inferenza del tipo locale abilitata).
Composizione delle query
Le istanze della ObjectQuery<T> classe generica, che implementa l'interfaccia generica IQueryable<T> , fungono da origine dati per le query LINQ to Entities. In una query specificare esattamente le informazioni che si desidera recuperare dall'origine dati. Una query può anche specificare la modalità di ordinamento, raggruppamento e forma delle informazioni prima della restituzione. In LINQ una query viene archiviata in una variabile. Questa variabile di query non esegue alcuna azione e non restituisce dati; archivia solo le informazioni della query. Dopo aver creato una query, è necessario eseguire la query per recuperare i dati.
Le query LINQ to Entities possono essere composte in due sintassi diverse: sintassi delle espressioni di query e sintassi di query basata su metodo. La sintassi delle espressioni di query e la sintassi delle query basate su metodo sono nuove in C# 3.0 e Visual Basic 9.0.
Per altre informazioni, vedere Query in LINQ to Entities.
Conversione di query
Per eseguire una query LINQ to Entities su Entity Framework, la query LINQ deve essere convertita in una rappresentazione dell'albero dei comandi che può essere eseguita in Entity Framework.
Le query LINQ to Entities sono costituite da operatori di query standard LINQ (ad esempio Select, Wheree GroupBy) ed espressioni (x > 10, Contact.LastName e così via). Gli operatori LINQ non sono definiti da una classe, ma sono invece metodi di una classe. In LINQ le espressioni possono includere qualsiasi elemento consentito dai tipi nello spazio dei nomi System.Linq.Expressions e quindi qualsiasi cosa possa essere rappresentata in una funzione lambda. Si tratta di un superset delle espressioni consentite da Entity Framework, che sono per definizione limitate alle operazioni consentite nel database e supportate da ObjectQuery<T>.
In Entity Framework, sia gli operatori che le espressioni sono rappresentati da una singola gerarchia di tipi, che vengono quindi posizionati in un albero dei comandi. L'albero dei comandi viene usato da Entity Framework per eseguire la query. Se la query LINQ non può essere espressa come albero dei comandi, verrà generata un'eccezione quando la query viene convertita. La conversione di query LINQ to Entities prevede due sotto conversioni: la conversione degli operatori di query standard e la conversione delle espressioni.
Esistono diversi operatori di query standard LINQ che non dispongono di una conversione valida in LINQ to Entities. I tentativi di utilizzo di questi operatori genereranno un'eccezione in fase di conversione delle query. Per un elenco degli operatori LINQ to Entities supportati, vedere Metodi LINQ supportati e non supportati (LINQ to Entities).
Per altre informazioni sull'uso degli operatori di query standard in LINQ to Entities, vedere Operatori di query standard in QUERY LINQ to Entities.
In generale, le espressioni in LINQ to Entities vengono valutate nel server, pertanto il comportamento dell'espressione non deve essere previsto segua la semantica CLR. Per ulteriori informazioni, vedere Espressioni nelle Query LINQ to Entities.
Per informazioni su come le chiamate al metodo CLR sono mappate alle funzioni canoniche nell'origine dati, vedere Mapping del Metodo CLR alle Funzioni Canoniche.
Per informazioni su come chiamare funzioni canoniche, di database e personalizzate dall'interno di query LINQ to Entities, vedere Chiamata di funzioni in query LINQ to Entities.
Esecuzione di query
Dopo che la query LINQ viene creata dall'utente, viene convertita in una rappresentazione compatibile con Entity Framework (sotto forma di alberi dei comandi), che viene quindi eseguita sull'origine dati. In fase di esecuzione della query, tutte le espressioni di query (o i componenti della query) vengono valutate nel client o nel server. Sono incluse le espressioni usate nella materializzazione dei risultati o nelle proiezioni di entità. Per altre informazioni, vedere Esecuzione di query. Per informazioni su come migliorare le prestazioni compilando una query una sola volta e quindi eseguendola più volte con parametri diversi, vedere Query compilate (LINQ to Entities).
Materializzazione
La materializzazione è il processo di restituzione dei risultati delle query al client come tipi CLR. In LINQ to Entities i record di dati dei risultati delle query non vengono mai restituiti; esiste sempre un tipo CLR sottostante, definito dall'utente o da Entity Framework o generato dal compilatore (tipi anonimi). Tutta la materializzazione degli oggetti viene eseguita da Entity Framework. Eventuali errori risultanti da un'impossibilità di eseguire il mapping tra Entity Framework e CLR causeranno la generazione di eccezioni durante la materializzazione degli oggetti.
I risultati delle query vengono in genere restituiti come uno dei seguenti:
Raccolta di zero o più oggetti entità tipizzati o una proiezione di tipi complessi definiti nel modello concettuale.
I tipi CLR supportati dall'Entity Framework.
Raccolte in linea.
Tipi anonimi.
Per altre informazioni, vedere Risultati della query.
In questa sezione
Interrogazioni in LINQ to Entities
Espressioni nelle query di LINQ per le entità
Chiamata di funzioni nelle query LINQ to Entities
Query compilate (LINQ to Entities)
Operatori di query standard nelle query di LINQ to Entities
Mappatura del metodo CLR alla funzione canonica
Metodi LINQ supportati e non supportati (LINQ to Entities)
Problemi noti e considerazioni in LINQ to Entities