LINQ : Language INtegrated Query

Immersion dans le framework

Rappel : Une expression à runtime

Une expression à runtime représente une expression valide à la compilation. Dans tous les langages de programmation, le compilateur génère des arbres syntaxiques abstraits pour chacune des expressions. Le framework .NET apporte une version "runtime" des AST. Ces arbres d'expressions sont évalués par des moteurs de traductions fournis avec le "LINQ provider". Le "LINQ provider", LINQ to SQL, fournit avec le framework .NET, embarque un moteur d'optimisation des requêtes, capable de générer une requête légèrement différente de celle attendue, mais en garantissant l'intégrité des résultats retounés.

Il faut savoir qu'avec LINQ to SQL, toutes les expressions qui compilent, sont garanties d'avoir une syntaxe SQL valide.

Une requête dans le framework

linq dans le framework

La partie droite du schéma montre l'intégration des requêtes LINQ dans le framework .NET. Comme il a été précisé précédemment, on voit bien l'intégration à tous les états du code. Dans un premier temps, notre requête, utilisant le sucre syntaxique, va passer dans le traducteur. Il va transformer les mots clés de la requête en méthodes (Select(), Where(), ...).

Durant la phase de compilation, le code IL va, en plus de contenir la traduction de notre code, déclarer nos types anonymes ou delegates anonymes. Ce sont des classes et méthodes avec des noms générés qui vont être substituées aux endroits où nous utilisions nos anonymes.

La dernière phase, lors de l'exécution, le Just In Time Compiler va traduire nos arbres d'expression par du code optimisé, des requêtes SQL, des requêtes XPath, ou encore n'importe quelles requêtes d'accès.

Ci-dessous, se trouve un schéma extrait de la MSDN expliquant le positionnement des requêtes LINQ par rapport à un framework d'ORM. Remarquez la différence entre la requête Entity SQL. Elle n'est transformée qu'après avoir reçu les informations du moteur de mapping, alors que la requête LINQ est directement transformée en arbre d'expression.

Linq to Entities