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

Esistono diversi modi per estendere LINQ per consentire l'esecuzione di query su qualsiasi 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 query su un'origine dati per cui è abilitata l'esecuzione di query LINQ, perché la sintassi e il modello della query non cambiano. Di seguito sono riportati i modi in cui LINQ può essere esteso a queste origini dati:

  • Implementazione dell'interfaccia IEnumerable<T> in un tipo per abilitare LINQ to Objects query di tale tipo.

  • Creazione di metodi di operatore di query standard, Where ad esempio e Select che estendono un tipo, per abilitare l'esecuzione di query LINQ personalizzate di tale tipo.

  • Creando un provider per l'origine dati che implementi l'interfaccia IQueryable<T>. Un provider che implementa questa interfaccia riceve query LINQ sotto forma di alberi delle espressioni, che può essere eseguito in modo personalizzato, ad esempio in modalità remota.

  • Creazione di 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

Esistono 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 query sui dati usando LINQ to Objects. Se non ha senso IEnumerable<T> abilitare l'enumerazione del tipo implementando l'interfaccia , è possibile definire metodi dell'operatore di query standard LINQ in tale tipo o creare metodi dell'operatore 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

L'opzione migliore per abilitare l'esecuzione di query LINQ di un'origine dati remota è implementare l'interfaccia IQueryable<T> . Tuttavia, ciò differisce dall'estensione di un provider, ad esempio 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 in base alla 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.

IQueryable Un provider complesso, ad esempio il provider LINQ to SQL, potrebbe 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