Dot.Blog

C#, XAML, WinUI, WPF, Android, MAUI, IoT, IA, ChatGPT, Prompt Engineering

Les 101 exemples de LINQ à portée de clic !

LINQ.. Je vous en parle très souvent car cela en vaut largement la peine. L'essayer c'est l'adopter, surtout que ses diverses moutures (Linq to XML, Linq to SQL, Linq to Object...) peuvent trouver leur place et rendre service dans tout type de développement.

Articles, astuces, j'ai beaucoup écrit sur LINQ et ce n'est certainement pas terminé. Mais il ne faudrait pas oublier les "101 exemples pour LINQ" créés par Microsoft.

A ma connaissance il n'existe pas de traduction, cela n'existe qu'en anglais. Mais c'est une belle visite de la syntaxe de LINQ et certainement un complément indispensable à une autoformation sur le sujet.

Ces exemples ne sont pas très récents mais je me suis rendu compte que peu de développeurs les connaissaient, au moins en France. D'où l'intérêt de rappeler leur existence.

Pour la petite histoire, le chef de projet qui a écrit ces exemples a touché $202 de la part de Anders... En effet, lorsqu'il a fallu écrire les exemples, Anders était assez pressé de voir le travail fini et avait promis $2 pour chaque exemple qui serait terminé à la dead-line, une sorte de plaisenterie. Le jour fatidique, arrivé en réunion, le chef de projet en avait réalisé 101. Anders a alors fouillé ses poches et a fait l'appoint, 101x2 = $202 qu'il a remis au gars un peu gêné, ne sachant s'il devait accepter ou pas... Ce bon chef de projet a utilisé la somme pour inviter le soir même les développeurs de son équipe au resto. Une belle histoire non ? :-)

PS: Vous pouvez aussi télécharger d'autres exemples Linq en cliquant ici [edit: en novembre 2012 le site pointé n'existe plus, sorry]. Ce n'est pas très récent (Ctp de mars 2007) mais pour ceux qui prennent Linq au vol plutôt qu'à ses débuts, il est fort probable, si vous êtes dans ce cas, que vous soyez passé à côté de ce téléchargement...

PS2: Si vous voulez faire tourner le code des 101 exemples LINQ, vous trouverez sur le site pointé par le lien donné en début d'article le code de la méthode GetProductList(). Ce code est assez exotique et ne compile pas. Il faut le modifier pour en tirer quelque chose. Pour vous simplifier la vous trouverez ci-après une unité de code C# contenant une définition correcte de cette fonction, encapsulée dans une classe abstraite. Cela devrait vous aider... Data.rar (2,26 kb)

Donner du peps à Linq ! (Linq dynamique et parser d'expressions)

J'ai eu moulte fois ici l'occasion de dire tout le bien que  je pense de LINQ, de sa puissance, de sa souplesse, de sa versatilité (de xml à SQL en passant par les objets et l'Entity Framework).

Mais une petite chose me chagrinait : toute cette belle puissance s'entendait "hard coded". Je veux dire par là que les expressions et requêtes LINQ s'écrivent en C# dans le code et qu'il semblait très difficile de rendre la chose très dynamique, sous entendu dépendant d'expressions tapées à l'exécution de l'application. En un mot, faire du LINQ dynamique comme on fait du SQL dynamique.

Ce besoin est bien réel et ne concerne pas que les sources SQL. Prenez une simple liste d'objets que l'utilisateur peut vouloir trier selon l'une des propriétés ou filtrer selon le contenu des objets... Comment implémenter une telle feature ?

Contourner ce manque en écrivant des parsers, en jonglant avec les expressions lamba et la réflexion n'est pas, il faut l'avouer, ce qu'il y a de plus simple. Mais rassurez-vous chez Microsoft des gens y ont pensé pour nous ! Seulement voila, la chose est assez confidentielle il faut bien le dire, et on ne tombe pas dessus par hasard. Ou alors c'était un jour à jouer au Lotto, voire à contrôler, selon les mauvaises langues, l'emploi du temps de sa femme !

La chose s'appelle "LINQ Dynamic Query Library", un grand nom pour une petite chose puisqu'il s'agit en réalité d'un simple fichier source C# à ajouter à ses applications.  Mais quel fichier source !

Toute la difficulté consiste donc à savoir que ce fichier existe et mieux, où il se cache... C'est là que c'est un peu vicieux, la chose se cache dans un sous-répertoire d'un zip d'exemples Linq/C#, fichier lui-même astucieusement planqué dans la jungle des milliers de téléchargement de MSDN...

Sans plus attendre allez chercher le fichier cliquant ici.

Une fois que vous aurez accepté les termes de la licence ("I Accept" tout en bas à gauche) vous recevrez le fichier "CSharpSamples.zip". Dans ce dernier (dont tout le contenu est vraiment intéressant) aller dans le répertoire "LinqSamples" puis dans le projet "DynamicQuery" vous descendrez dans une autre sous-répertoire appelé lui aussi "DynamicQuery" (non, ce n'est pas un jeu de rôle, juste un téléchargement MSDN!). Et là, le Graal s'y trouve, "Dynamic.cs".

Copiez-le dans vos projets, et ajouter un "using System.Linq.Dynamic". A partir de là vous pourrez utiliser la nouvelle syntaxe permettant de faire du LINQ dynamique. A noter que dans le répertoire de la solution vous trouverez aussi un fichier "Dynamic Expressions.html" qui explique la syntaxe du parser.

Quelles sont les possibilités de LINQ Dynamic Query Library ?

C'est assez simple, pour vous expliquer en deux images je reprend deux captures écrans tirées du blog de Scott Guthrie (un excellent blog à visiter si vous parlez l'anglais).

Voici un exemple de requête LINQ (en VB.NET, si j'avais refait la capture cela aurait été du C#, mais je ne vais pas rouspéter hein ! )

Maintenant voici la même requête utilisant du LINQ dynamique :

Vous voyez l'astuce ? Le filtrage et le tri sont maintenant passés en chaîne de caractères... Bien entendu cette chaîne peut avoir été construite dynamiquement par code (c'est tout l'intérêt) ou bien saisie depuis un TextBox rempli par l'utilisateur.

Ici pas de risque d'attaque par "SQL injection", d'abord parce que LINQ n'est pas limité à SQL et que le problème ne se pose que dans ce cas, mais surtout parce que LINQ to SQL utilise des classes issues d'un modèle de données "type safe" et que par défaut LINQ to SQL est protégé contre les attaques de ce type. Pas de souci à se faire donc.

Pour terminer j'insisterai lourdement sur le fait que LINQ ne se limite pas aux données SQL, et que l'astuce de LINQ dynamique ici décrite s'applique même à LINQ to Object par exemple. Laisser la possibilité à un utilisateur de trier une List<> ou une Collection<>, de la filtrer, tout cela en mémoire et sans qu'il y ait la moindre base de données est bien entendu possible.

LINQ est vraiment une innovation majeure en matière de programmation, pouvoir le dynamiser simplement c'est atteindre le nirvana...

Je vous laisse vous jeter sur vos claviers pour expérimenter du LINQ dynamique, amusez-vous bien !

..et surtout.. Stay tuned !