C# Language Traduire une requête LINQ en requête SQL


Exemple

Les interfaces IQueryable et IQueryable<T> permettent aux développeurs de traduire une requête LINQ (une requête «intégrée au langage») en une source de données spécifique, par exemple une base de données relationnelle. Prenez cette requête LINQ écrite en C #:

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

Si la variable books est d'un type qui implémente IQueryable<Book> la requête ci-dessus est transmise au fournisseur (défini sur la propriété IQueryable.Provider ) sous la forme d'un arbre d'expression, une structure de données qui reflète la structure du code. .

Le fournisseur peut inspecter l'arborescence d'expression à l'exécution pour déterminer:

  • qu'il existe un prédicat pour la propriété Author de la classe Book ;
  • que la méthode de comparaison utilisée est 'égale' ( == );
  • que la valeur à égaler est "Stephen King" .

Avec ces informations, le fournisseur peut traduire la requête C # en requête SQL à l'exécution et transmettre cette requête à une base de données relationnelle pour extraire uniquement les livres correspondant au prédicat:

select *
from Books
where Author = 'Stephen King'

Le fournisseur est appelé lorsque la variable de query est itérée sur ( IQueryable implémente IEnumerable ).

(Le fournisseur utilisé dans cet exemple nécessiterait des métadonnées supplémentaires pour savoir quelle table interroger et savoir comment faire correspondre les propriétés de la classe C # aux colonnes de la table, mais ces métadonnées ne relèvent pas de l'interface IQueryable .)