Condividi tramite


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 essere una struttura di dati, un servizio Web, un file system o un database, per denominare alcuni. Il modello LINQ rende più semplice per i client eseguire query su un'origine dati per cui è abilitata l'esecuzione di query LINQ, perché la sintassi e il modello della query non cambiano. I modi in cui LINQ può essere esteso a queste origini dati includono quanto segue:

  • Implementazione dell'interfaccia IEnumerable<T> in un tipo per abilitare l'esecuzione di query LINQ su oggetti di tale tipo.

  • Creazione di metodi dell'operatore di query standard come Where e Select che estendono un tipo, per abilitare l'esecuzione di query LINQ personalizzate su quel tipo.

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

  • Creazione di un provider per l'origine dati che sfrutti una tecnologia LINQ esistente. Tale provider consente 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 illustrate queste opzioni.

Come abilitare l'esecuzione di query LINQ sulla tua origine dati

In-Memory Dati

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 abilitare l'enumerazione del tuo tipo implementando l'interfaccia IEnumerable<T>, è possibile definire metodi dell'operatore di query standard LINQ in quel tipo o creare metodi dell'operatore di query standard LINQ che estendono il tipo. Le implementazioni personalizzate degli operatori di query standard devono usare l'esecuzione posticipata per restituire i risultati.

Dati remoti

L'opzione migliore per abilitare l'esecuzione di query LINQ di un'origine dati remota consiste nell'implementare l'interfaccia IQueryable<T> . Tuttavia, ciò differisce dall'estensione di un provider, come LINQ to SQL, a una fonte di 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 nella loro complessità. In questa sezione vengono illustrati i diversi livelli di complessità.

Un provider meno complesso IQueryable potrebbe interfacciarsi con un singolo metodo di un servizio Web. Questo tipo di provider è molto specifico perché prevede informazioni specifiche nelle query gestite. Ha un sistema di tipi chiuso, ad esempio esponendo un singolo tipo di risultato. La maggior parte dell'esecuzione della query viene eseguita localmente, ad esempio usando le Enumerable implementazioni degli operatori di query standard. Un provider meno complesso potrebbe esaminare una sola espressione di chiamata al metodo nell'albero delle espressioni che rappresenta la query e consentire la logica rimanente della query venga gestita altrove.

Un IQueryable provider di complessità media potrebbe avere come destinazione un'origine dati con un linguaggio di query parzialmente espressivo. Se è destinato a un servizio Web, potrebbe interfacciarsi con più metodi del servizio Web e selezionare il metodo da chiamare in base alla domanda posta dalla query. Un provider di complessità media avrebbe un sistema di tipi più completo rispetto a un semplice provider, ma sarebbe comunque un sistema di tipi fisso. Ad esempio, il provider potrebbe esporre tipi con relazioni uno-a-molti che possono essere attraversate, ma non fornisce la tecnologia di mapping per i tipi definiti dall'utente.

Un provider complesso IQueryable , ad esempio il provider LINQ to SQL, potrebbe tradurre query LINQ complete in un linguaggio di query espressivo, ad esempio SQL. Un provider complesso è più generale di un provider meno complesso, perché può gestire un'ampia gamma di domande nella query. Ha anche un sistema di tipi aperto e pertanto deve contenere un'infrastruttura estesa per eseguire il mapping dei tipi definiti dall'utente. Lo sviluppo di un provider complesso richiede una notevole quantità di lavoro.

Vedere anche