Abilitazione di un'origine dati per l'esecuzione di query LINQ

Sono disponibili vari modi per estendere LINQ in modo da consentire l'esecuzione di una query su un'origine dati nel modello LINQ. L'origine dati potrebbe, ad esempio, essere una struttura ad albero dei dati, un servizio Web, un file system o un database. Il modello LINQ consente ai client di eseguire una query su un'origine dati per la quale è attivata l'esecuzione di queryLINQ, poiché la sintassi e il modello della query non vengono modificati. Di seguito vengono riportati i modi in cui LINQ può essere esteso a queste origini dati:

  • Implementando l'interfaccia IEnumerable<T> in un tipo in modo da consentire l'esecuzione di query LINQ to Objects su quel tipo.

  • Creando i metodi degli operatori di query standard, ad esempio Where e Select, che estendono un tipo in modo da consentire l'esecuzione di query LINQ personalizzate su quel tipo.

  • Creando un provider per l'origine dati che implementi l'interfaccia IQueryable<T>. Un provider che implementa questa interfaccia riceve le query LINQ sotto forma di strutture ad albero dell'espressione, che possono essere eseguite in modo personalizzato, ad esempio in modalità remota.

  • Creando un provider per l'origine dati che sfrutta una tecnologia LINQ esistente. Tale provider consentirebbe non solo l'esecuzione di query, ma anche le operazioni di inserimento, aggiornamento ed eliminazione e il mapping per i tipi definiti dall'utente.

In questo argomento vengono descritte queste opzioni.

Come attivare l'esecuzione di query LINQ sull'origine dati

Dati in memoria

Sono disponibili due modalità per consentire l'esecuzione di query LINQ sui dati in memoria. Se il tipo di dati implementa IEnumerable<T>, è possibile eseguire una query sui dati utilizzando LINQ to Objects. Se non ha senso attivare l'enumerazione del tipo implementando l'interfaccia IEnumerable<T>, è possibile definire i metodi degli operatori di query standard LINQ in quel tipo o creare metodi degli operatori di query standard LINQ che estendono il tipo. Le implementazioni personalizzate degli operatori di query standard devono utilizzare l'esecuzione posticipata per restituire i risultati.

Dati remoti

La migliore opzione per attivare l'esecuzione di query LINQ su un'origine dati remota è implementare l'interfaccia IQueryable<T>. È tuttavia diverso dall'estendere un provider come LINQ to SQL per un'origine dati. In Visual Studio 2008 non sono disponibili modelli di provider per l'estensione di tecnologie LINQ esistenti, ad esempio LINQ to SQL, ad altri tipi di origine dati.

Provider LINQ IQueryable

I provider LINQ che implementano IQueryable<T> possono variare notevolmente a seconda della complessità. In questa sezione vengono illustrati i diversi livelli di complessità.

Un provider IQueryable meno complesso potrebbe interfacciarsi con un singolo metodo di un servizio Web. Questo tipo di provider è molto specifico poiché prevede informazioni specifiche nelle query che gestisce. Ha un sistema del tipo chiuso, forse esponendo un solo tipo di risultato. La maggior parte dell'esecuzione della query avviene localmente, utilizzando ad esempio le implementazioni Enumerable degli operatori di query standard. Un provider meno complesso potrebbe esaminare solo un'espressione della chiamata al metodo nella struttura ad albero dell'espressione che rappresenta la query facendo sì che la logica rimanente della query venga gestita altrove.

Un provider IQueryable mediamente complesso potrebbe essere destinato a un'origine dati che ha un linguaggio di query parzialmente espressivo. Se è destinato a un servizio Web, potrebbe interagire con più metodi del servizio Web e selezionare il metodo da chiamare in base alla domanda posta dalla query. Un provider mediamente complesso può avere un sistema di tipi più dettagliato rispetto a un provider semplice, ma rimane sempre un sistema di tipi fisso. Ad esempio, il provider può esporre tipi che hanno relazioni uno-a-molti che possono essere attraversate, ma non fornisce la tecnologia di mapping per i tipi definiti dall'utente.

Un provider IQueryable complesso, ad esempio il provider LINQ to SQL, può convertire le query LINQ complete in un linguaggio di query espressivo come SQL. Un provider complesso è più generale di un provider meno complesso, poiché può gestire molte più domande nella query. Ha anche un sistema di tipi aperto e pertanto deve contenere un'infrastruttura completa per eseguire il mapping dei tipi definiti dall'utente. Lo sviluppo di un provider complesso è molto impegnativo.

Per ulteriori informazioni sulla creazione di provider LINQ, vedere l'argomento Procedura dettagliata: creazione di un provider LINQ IQueryable e i post LINQ: Building an IQueryable Provider e Link to Everything: A List of LINQ Providers nei blog MSDN (le pagine potrebbero essere in inglese).

Vedere anche

Attività

Procedura dettagliata: creazione di un provider LINQ IQueryable

Riferimenti

IQueryable<T>

IEnumerable<T>

Enumerable

Concetti

Cenni preliminari sugli operatori di query standard

LINQ to Objects

Altre risorse

LINQ: compilazione di un provider IQueryable

Semplicità di collegamento: un elenco di provider LINQ