Ceci est une traduction assez libre de la série de billets rédigés par Bill Horst pour apprendre comment passer du langage SQL au langage LINQ et plus spécialement en VB LINQ. Pour ma part, j’ai adapté les explications et les exemples de codes pour cibler la syntaxe C# du langage LINQ.
Ce troisième billet de la série continue la description des clauses spécifiques et il va porter sur la façon de transformer les clauses DISTINCT, WHERE et ORDER BY en clauses LINQ.
La clause DISTINCT
Les commandes SQL SELECT peuvent contenir un mot-clé DISTINCT
qui sert à supprimer tous les doublons dans les résultats renvoyés. Avec le
langage LINQ, il n'existe pas de mot-clé "distinct" qui pourrait
compléter la clause select ou être inséré au niveau de la requête LINQ. Pour
éviter d'avoir des doublons dans les résultats obtenus, il faut employer la
méthode Distinct(). Cette méthode renvoie des éléments distincts à
partir de la source sur laquelle on l'applique. Les deux exemples ci-dessous
ont le même effet :
SQL :
SELECT DISTINCT Region FROM ClientTable
LINQ :
var ListeRegions = (from Contact in ClientListe
select Contact.Region).Distinct();
La clause WHERE
Comme pour une requête SQL, une expression LINQ permet elle aussi de filtrer
les résultats renvoyés en ajoutant une clause "where". Cette
clause peut contenir n’importe quelle expression C# booléenne.
SQL :
SELECT * FROM ClientTable WHERE Region = 'PACA'
LINQ :
from Contact in ClientListe where Contact.Region == "PACA" select Contact
Utiliser un opérateur
Avec SQL, les clauses WHERE contiennent très souvent d’autres
opérateurs comme AND par exemple. Il existe généralement un
opérateur équivalent en C# qui peut être employé au niveau de la clause
where de la requête LINQ pour obtenir le même genre de
résultat.
SQL :
SELECT * FROM ClientTable WHERE Region = 'PACA' AND CodePostal = '06570'
LINQ :
from Contact in ClientListe where Contact.Region == "PACA" && Contact.CodePostal == "06570" select Contact
Même lorsqu’il n’existe pas vraiment d’équivalent en C#, il est généralement
possible de reproduire n’importe quelle expression SQL sous forme d’expression
C#. Par exemple, il n’existe pas de mot-clé en C# qui corresponde au mot-clé
"BETWEEN" du SQL. Mais on peut facilement obtenir un résultat
similaire en C#.
SQL :
SELECT * FROM CommandeTable WHERE DateCommande BETWEEN '2010-01-01' AND '2010-12-31'
LINQ :
from Colis in CommandeListe where Colis.DateCommande >= "2010-01-01" && Colis.DateCommande <= "2010-12-31" select Colis
Dans le cas de l’opérateur "IN" du SQL, il est possible
d’utiliser la méthode Contains() pour arriver au même
résultat :
SQL :
SELECT *
FROM ClientTable
WHERE Region IN ('IDF', 'PACA')
LINQ :
string[] regions = { "RA", "PACA" };
var ContactsSud = from Contact in ClientListe
where regions.Contains(Contact.Region)
select Contact
La clause ORDER BY
La clause ORDER BY du SQL peut elle aussi être représentée par
une expression LINQ. La cause "orderby" du langage LINQ sert à
indiquer comment les résultats doivent être classés en définissant une liste
d’expressions séparées par des virgules. Il est possible d’employer n’importe
quelle expression C#, sans qu’il soit nécessaire que cette expression fasse
parti des éléments sélectionnés dans la requête LINQ.
SQL :
SELECT * FROM ClientTable ORDER BY Telephone
LINQ :
from Contact in ClientListe orderby Contact.Telephone select Contact
Définir l’ordre du tri
La clause SQL ORDER BY peut aussi contenir les mots-clés
ASC ou DESC pour préciser sir le tri doit de faire de
façon croissante ou décroissante. Avec LINQ, il faut utiliser les mots-clés
"ascending" ou "descending" pour obtenir le même
résultat. Quand aucun de ces mots-clés n’est indiqué, le tri est réalisé de
façon croissante par défaut.
SQL :
SELECT * FROM ClientTable ORDER BY Telephone ASC, Nom DESC
LINQ :
from Contact in ClientListe orderby Contact.Telephone ascending, Contact.Nom descending select Contact
Conclusion
Avec ce nouveau billet et les deux billets précédents, il vous est possible de convertir des requêtes SQL basiques en requêtes LINQ. Dans le prochain billet, j’aborderai la façon de traduire les fonctions scalaires ou les fonctions d’agrégations du SQL en LINQ
