Blog ENI : Toute la veille numérique !
En raison d'une opération de maintenance, le site Editions ENI sera inaccessible le mardi 10 décembre, en début de journée. Nous vous invitons à anticiper vos achats. Nous nous excusons pour la gêne occasionnée
En raison d'une opération de maintenance, le site Editions ENI sera inaccessible le mardi 10 décembre, en début de journée. Nous vous invitons à anticiper vos achats. Nous nous excusons pour la gêne occasionnée
  1. Livres et vidéos
  2. C# 10
  3. Présentation de LINQ
Extrait - C# 10 Développez des applications Windows avec Visual Studio 2022
Extraits du livre
C# 10 Développez des applications Windows avec Visual Studio 2022
5 avis
Revenir à la page d'achat du livre

Présentation de LINQ

Les requêtes LINQ

LINQ (Language INtegrated Query) apporte une syntaxe de requête au langage C#. Il devient possible d’accéder à différentes sources de données en utilisant une seule et même syntaxe grâce au niveau d’abstraction fourni.

L’espace de noms System.Linq doit être spécifié parmi les clauses using.

1. La syntaxe

Une requête LINQ utilise des mots-clés prédéfinis tels que from, where, orderby ou select pour extraire les données d’une collection d’objets :

var query = from ms in _db.MailServers 
             where ms.Host == "mail.mondomaine.com" 
             orderby ms.Username 
             select ms; 

La requête précédente retourne une liste d’objets de type MailServer ayant la valeur mail.mondomaine.com pour la propriété Host et les ordonne par la propriété Username.

Une requête LINQ doit commencer par la clause from et finir par la clause select ou group. Entre ces deux clauses de début et de fin, il peut facultativement y avoir des clauses where, orderby ou join parmi d’autres ainsi que des clauses from supplémentaires.

La variable...

Les opérateurs de requêtes

La classe Enumerable définit de nombreuses méthodes permettant de construire des requêtes LINQ. Chacune possède un équivalent sous forme d’un mot-clé permettant de construire les requêtes LINQ sans faire appel aux méthodes.

1. Filtrer

a. Where

La méthode Where permet de combiner des expressions booléennes comme pour une requête SQL :

IEnumerable<Entities.MailServer> mailServers = _db.MailServers 
                 .Where(ms => ms.Host == "mail.mondomaine.com") 
                 .Select(ms => ms); 

La requête LINQ équivalente est la suivante :

var query = from ms in _db.MailServers 
            where ms.Host == "mail.mondomaine.com" 
            select ms; 

Une surcharge de la méthode Where permet de passer en second paramètre l’index. Cet index est disponible pour chaque résultat retourné. Il peut donc être utilisé dans l’expression booléenne :

IEnumerable<Entities.MailServer> mailServers = _db.MailServers 
                .Where((ms, index) =>  
                    ms.Host == "mail.mondomaine.com" 
                    && index < 2) 
                .Select(ms => ms); 

b. OfType<TResult>

La méthode OfType<TResult> permet de créer un filtre sur le type de l’objet :

IEnumerable<Entities.MailServer> mailServers = _db.MailServers 
                 .OfType<Entities.MailServer>() 
                 .Select(ms =>...

Les requêtes parallèles

Le Framework .NET fournit la nouvelle classe ParallelEnumerable dans l’espace de noms System.Linq. Elle permet de répartir les requêtes sur plusieurs tâches de manière à améliorer leurs performances.

Le gain de performances des requêtes parallèles est particulièrement visible avec des tableaux, listes ou tout type de collections de très grandes tailles. La machine qui exécute l’application doit également posséder plusieurs processeurs de manière à ce que la charge soit répartie. Les améliorations ne seront pas visibles avec une machine monoprocesseur.

Pour illustrer les requêtes parallèles, créez une grande liste remplie de valeurs aléatoires :

int size = 150000000; 
List<Int64> list = new List<Int64>(size); 
Random rand = new Random(); 
for (int i = 0; i < size; i++) 
{ 
    list.Add(rand.Next(20)); 
} 

Maintenant, ajoutez l’instruction permettant de calculer la valeur moyenne de toutes les valeurs de la liste :

double avg = list.AsParallel() 
                  .Where(i => i > 10) 
                  .Select(i...