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...