Appréhender LINQ

LINQ pour Language INtegrated Query est un composant du Framework .NET qui permet de requêter à peu prêt tout et n’importe quoi (Objet, XML, Base de données, Entité, …), mais pas toujours évident de s’y retrouver. Alors par où commencer ? Comme toute techno Microsoft qui se respecte, LINQ dispose d’un Getting Started pour C# (ou pour VB) sur le MSDN et les fonctionnalités proposées bénéficient du support de l’IntelliSense dans Visual Studio.

Mais pourquoi LINQ est-il tellement intéressant ? Prenons un petit exemple à travers une simple application console en C# :

public class Etudiant
{
    public string Prenom { get; set; }
    public string Nom { get; set; }
    public List<int> Notes { get; set; }
}

public class Program
{
    static void Main(string[] args)
    {
        // Création de la liste d'étudiants
        var etudiants = new List<Etudiant> {
            new Etudiant {Prenom="Mike", Nom="DOE", Notes=new List {20, 10, 15}},
            new Etudiant {Prenom="Albert", Nom="DURAND", Notes=new List {11, 3, 8}},
            new Etudiant {Prenom="Hans", Nom="MULLER", Notes=new List {11, 13, 15}},
            new Etudiant {Prenom="Juan", Nom="FERNANDEZ", Notes=new List {14, 12, 16}}
        };

        Console.WriteLine("Parcours de la liste telle qu'elle a été créée");
        // Parcours de la liste telle qu'elle a été créée
        foreach (var etudiant in etudiants)
        {
            Console.WriteLine(etudiant.Prenom + " " + etudiant.Nom);
        }

        // Requête LINQ renvoyant la liste des étudiants qui ont une moyenne supérieure ou égale à 10 en les classant par ordre alphabétique
        var requeteLinq = from e in etudiants orderby e.Prenom where e.Notes.Average() >= 10 select new { e, Moyenne = e.Notes.Average() };

        Console.WriteLine();
        Console.WriteLine("Parcours de la liste issue de la requête LINQ");
        // Parcours de la liste issue de la requête LINQ
        foreach (var resultat in requeteLinq.ToList())
        {
            Console.WriteLine(resultat.e.Prenom + " " + resultat.e.Nom + " a " + resultat.Moyenne + " de moyenne.");
        }

        Console.Read();
    }
}

Dans l’extrait de code ci-dessus, la requête LINQ à la ligne 29, nous permet de récupérer les étudiants qui ont une moyenne supérieure ou égale à 10 en les classant par ordre alphabétique (d’après leur prénom) et tout cela en une seule ligne. Bien entendu LINQ dispose de beaucoup d’autres fonctionnalités, et quelque soit votre source de données, vous pourrez la requêter de la même manière.

Télécharger la Solution pour Visual Studio 2013 – TestLinq.zip

Avant de vous laisser vous aventurer dans les profondeurs du code pour découvrir plus en détails les possibilités de LINQ, j’aimerais vous présenter deux logiciels qui pourront vous être utiles. Le premier d’entre eux est LINQPad, cet outil permet de requêter directement une source de données en LINQ. Une fois vos connexions ajoutées (en rouge), vous pouvez sélectionner celle de votre choix (en bleu), puis saisir votre requête LINQ (en jaune) avant de l’exécuter (en vert). Les résultats apparaissent alors dans partie basse (en violet) et il est par exemple possible de voir le code SQL généré (en orange).

LINQPad

Si comme moi, vous êtes plus familier avec SQL qu’avec LINQ, Linqer devrait vous plaire. Il s’agît d’un outil permettant de traduire vos requêtes SQL en LINQ. Il est malheureusement payant, mais les 20 jours proposés gratuitement par la version d’essai devraient être suffisant pour découvrir LINQ. Sur Linqer nous retrouvons l’ajout des connexions (en rouge) et le choix de la connexion courante (en bleu), la zone de saisie pour la requête SQL (en jaune), sa commande d’exécution (en vert) et celle de traduction (en orange). La zone de résultat est elle aussi dans la partie basse (en violet).

Linqer

J’espère que ce premier article un peu plus orienté technique vous a plu, n’hésitez pas à commenter, à donner votre avis ou des vos idées pour de prochains articles.

Facebooktwitterlinkedinmail

2 Commentaires

  1. SPONY

    Salut, excellent article,

    Effectivement Linq c’est juste magique (quand on sait bien l’utiliser)

    Par contre tu as oublié le type de la liste (mais il est présent dans le zip)

    Répondre
    1. Franck Borschneck (Auteur de l'article)

      Exact, j’avais du copier-coller le code avant de mettre les balises, du coup il a dû considérer les types de listes comme du HTML. Merci pour la remarque en tout cas 😉

      Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.