Abilitazione di un'origine dati per l'esecuzione di query LINQ (Visual Basic)

Esistono diversi 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 query LINQ, poiché la sintassi e il modello della query non vengono modificati. Di seguito vengono riportati i modi in cui è possibile estendere LINQ a queste origini dati:

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

  • Creando metodi degli operatori query standard, ad esempio Where e Select, che estendono un tipo in modo da consentire l'esecuzione di query LINQ personalizzate per 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.

  • Creazione di un provider per l'origine dati in grado di sfruttare 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

Ci sono due modi per abilitare l'esecuzione di query LINQ sui dati in memoria. Se i dati sono di un tipo che implementa IEnumerable<T>, è possibile eseguire una query sui dati usando LINQ to Objects. Se non ha senso abilitare l'enumerazione del tipo implementando l'interfaccia IEnumerable<T>, è possibile definire i metodi degli operatori query standard LINQ in quel tipo oppure creare metodi degli operatori 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

L'opzione migliore per abilitare l'esecuzione di query LINQ su un'origine dati remota consiste nell'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 per quanto riguarda la 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 query LINQ complete in un linguaggio di query espressivo, ad esempio SQL. Un provider complesso è più generale di un provider meno complesso, poiché può gestire un'ampia gamma di 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.

Vedi anche