LINQ to Entities

LINQ to Entities fornisce il supporto LINQ (Language Integrated Query) 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 da query ad albero dei comandi, eseguite sul contesto dell'oggetto. LINQ to Entities consente di convertire query LINQ (Language Integrated Query) in query ad albero dei comandi, eseguire le query su Entity Framework e restituire oggetti che possono essere usati sia da Entity Framework sia da LINQ. Di seguito viene descritto il processo di creazione ed esecuzione di una query LINQ to Entities:

  1. Costruire un'istanza di ObjectQuery<T> da ObjectContext.

  2. Comporre una query LINQ to Entities in C# o Visual Basic usando l'istanza di ObjectQuery<T>.

  3. Convertire gli operatori e le espressioni di query standard LINQ in alberi dei comandi.

  4. 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.

  5. Restituire i risultati della query al client.

Costruzione di un'istanza di ObjectQuery

La classe generica ObjectQuery<T> rappresenta una query che restituisce una raccolta di zero o più entità tipizzate. Una query di oggetto viene in genere costruita da un contesto dell'oggetto esistente anziché manualmente e appartiene sempre a tale contesto dell'oggetto. Il contesto fornisce le informazioni relative a connessione e metadati necessarie per comporre ed eseguire la query. La classe generica ObjectQuery<T> implementa l'interfaccia generica IQueryable<T>, i cui metodi del generatore consentono la compilazione incrementale delle query LINQ. È inoltre possibile consentire al compilatore di dedurre il tipo di entità tramite la parola chiave var di C# (Dim in Visual Basic, con inferenza di tipi locale abilitata).

Composizione di query

Le istanze della classe generica ObjectQuery<T>, che implementa l'interfaccia generica IQueryable<T>, fungono da origine dati per le query LINQ to Entities. In una query è necessario specificare con esattezza le informazioni che si desidera recuperare dall'origine dati. Una query può inoltre specificare in che modo ordinare, raggruppare e formattare le informazioni prima che vengano restituite. In LINQ una query viene archiviata in una variabile. La variabile di query non esegue azioni né restituisce dati. Viene solo usata per archiviare le informazioni sulla query. Dopo aver creato una query è necessario eseguirla per recuperare eventuali dati.

Le query LINQ to Entities possono essere composte in due sintassi diverse, ovvero la sintassi delle espressioni di query e la sintassi delle query basate su metodo. La sintassi delle espressioni di query e la sintassi delle query basate su metodo rappresentano una novità in C# 3.0 e Visual Basic 9.0.

Per altre informazioni, vedere Query in LINQ to Entities.

Conversione della query

Per eseguire una query LINQ to Entities su Entity Framework, è necessario convertire la query LINQ in una rappresentazione ad albero dei comandi che possa essere eseguita su Entity Framework.

Le query di LINQ to Entities includono operatori (ad esempio Select, Where e GroupBy) ed espressioni (x > 10, Contact.LastName e così via) di query standard LINQ. Gli operatori LINQ non sono definiti da una classe, ma sono piuttosto metodi in una classe. In LINQ le espressioni possono contenere tutto ciò che è consentito dai tipi all'interno dello spazio dei nomi System.Linq.Expressions e, per estensione, tutto ciò che può essere rappresentato in una funzione lambda. Si tratta di un superset delle espressioni consentite da Entity Framework, per definizione limitate alle operazioni consentite sul database, e supportate da ObjectQuery<T>.

In Entity Framework sia gli operatori sia le espressioni sono rappresentati da una singola gerarchia dei tipi e vengono quindi inclusi 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, viene generata un'eccezione durante la conversione della query. La conversione di query LINQ to Entities comporta due conversioni secondarie: la conversione degli operatori di query standard e la conversione delle espressioni.

Per un certo numero di operatori di query standard LINQ non è disponibile una conversione valida in LINQ to Entities. Qualsiasi tentativo di usare tali operatori restituirà un'eccezione in fase di conversione della 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.

Poiché in generale le espressioni in LINQ to Entities vengono valutate nel server, non è previsto che il comportamento dell'espressione sia conforme alla semantica CLR. Per altre informazioni, vedere Espressioni in query di LINQ to Entities.

Per informazioni su come le chiamate ai metodi CLR vengono mappate alle funzioni canoniche nell'origine dati, vedere Metodo CLR per il mapping di funzioni canoniche.

Per informazioni su come chiamare le funzioni canoniche, di database e personalizzate dall'interno delle query, vedere Chiamata di funzioni in query di LINQ to Entities.

Esecuzione di query

Al termine della creazione della query LINQ da parte dell'utente, la query viene convertita in una rappresentazione compatibile con Entity Framework, sotto forma di alberi dei comandi, e 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, 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 per volta e quindi eseguendola molte volte con parametri diversi, vedere Query compilate (LINQ to Entities).

Materializzazione

La materializzazione è il processo di restituzione dei risultati della query al client come tipi CLR. In LINQ to Entities i record di dati dei risultati della query non vengono mai restituiti, ma è sempre disponibile un tipo CLR di supporto definito dall'utente o da Entity Framework oppure generato dal compilatore (tipi anonimi). Tutta la materializzazione degli oggetti viene eseguita da Entity Framework. Qualsiasi errore correlato all'impossibilità di eseguire il mapping tra Entity Framework e CLR comporterà la generazione di eccezioni durante la materializzazione degli oggetti.

I risultati della query vengono in genere restituiti come uno degli elementi seguenti:

  • Raccolta di zero o più oggetti entità tipizzate o proiezione di tipi complessi definiti nel modello concettuale.

  • Tipi CLR supportati da Entity Framework.

  • Raccolte inline.

  • Tipi anonimi.

Per altre informazioni, vedere Risultati delle query.

In questa sezione

Query in LINQ to Entities

Espressioni in query di LINQ to Entities

Chiamata di funzioni in query di LINQ to Entities

Query compilate (LINQ to Entities)

Esecuzione di query

Risultati query

Operatori di query standard in query di LINQ to Entities

Metodo CLR per il mapping di funzioni canoniche

Metodi LINQ supportati e non supportati (LINQ to Entities)

Problemi noti e considerazioni in LINQ to Entities

Vedi anche