C# Language Tradurre una query LINQ in una query SQL


Esempio

Le IQueryable e IQueryable<T> consentono agli sviluppatori di tradurre una query LINQ (una query "language-integrated") in un'origine dati specifica, ad esempio un database relazionale. Prendi questa query LINQ scritta in C #:

var query = from book in books
            where book.Author == "Stephen King" 
            select book;

Se la variabile books è di un tipo che implementa IQueryable<Book> la query precedente viene passata al provider (impostata sulla proprietà IQueryable.Provider ) sotto forma di un albero di espressioni, una struttura di dati che riflette la struttura del codice .

Il provider può ispezionare l'albero delle espressioni in fase di esecuzione per determinare:

  • che esiste un predicato per la proprietà Author della classe Book ;
  • che il metodo di confronto utilizzato è 'uguale' ( == );
  • che il valore che dovrebbe eguagliare è "Stephen King" .

Con queste informazioni il provider può tradurre la query C # in una query SQL in fase di runtime e passare quella query a un database relazionale per recuperare solo quei libri che corrispondono al predicato:

select *
from Books
where Author = 'Stephen King'

Il provider viene chiamato quando la variabile di query viene iterata su ( IQueryable implementa IEnumerable ).

(Il provider utilizzato in questo esempio richiede alcuni metadati aggiuntivi per sapere quale tabella interrogare e sapere come abbinare le proprietà della classe C # alle colonne della tabella, ma tali metadati sono al di fuori dell'ambito dell'interfaccia IQueryable .)