Convertir SQL en LINQ : FROM et SELECT
2010-02-23 #csharp#linq
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.
Après un premier billet pour comparer SQL et LINQ, ce deuxième billet de la série va présenter comment gérer des clauses plus spécifiques du SQL, en commençant par deux des clauses les plus importantes : FROM et SELECT.
La clause FROM
Une commande SQL SELECT débute toujours par une clause SELECT suivie d'une
clause FROM. Dans le cas de LINQ, une expression commence toujours par une
clause from
(ou aggregate
comme nous le verrons par
la suite). La clause SQL FROM de base indique la table sur laquelle va porter
la requête, et de façon similaire, la clause LINQ from indique l'objet sur
lequel va porter la requête (ClientListe dans notre exemple).
Cet objet peut représenter des données en mémoire, des données d'une table SQL ou des données XML. Dans les exemples à venir, j'utilise des données "en mémoire" pour que le code soit suffisamment simple. En plus de cet objet sur lequel porte la requête, la clause LINQ from contient toujours un identifiant pour la "ligne" courante (Contact dans notre exemple) qui sert d'alias pour représenter cette ligne.
Avec SQL, il suffit de faire SELECT *
pour sélectionner toutes
les colonnes de la table. En ce qui concerne LINQ, il suffit d'utiliser la
clause select alias
pour renvoyer tous les membres de l'objet
requêté :
SQL
SELECT *
FROM ClientTable
LINQ
from Contact in ClientListe
select Contact
Utiliser un alias dans le FROM
En SQL, il est possible de définir un alias sur une table au niveau de la partie FROM de la requête. Cela permet ensuite de faire référence aux colonnes de la table source par l'intermédiaire de cet alias. Comme nous l'avons vu dans le paragraphe précédent, l'identifiant qui est défini au niveau de la clause from en LINQ sert lui aussi essentiellement à cela :
SQL
SELECT Contact.ClientID, Contact.Telephone
FROM ClientTable Contact
LINQ
from Contact in ClientListe
select new { Contact.ClientID, Contact.Telephone }
La clause SELECT
En SQL, les commandes SELECT contiennent une liste des valeurs à sélectionner parmi les informations disponibles (Nom, Telephone, Ville…). De la même façon, le langage LINQ vous permet lui aussi de sélectionner certains des membres pour renvoyer un objet anonyme constitué à partir de cette sélection.
Il n'est absolument pas nécessaire que les membres que vous définissez
correspondent à l'objet que vous avez spécifié au niveau de la clause from. Il
peut en effet s'agir de n'importe quelle expression C# valide (comme par
exemple 3 + 4
). S'il n'est pas possible de déduire le nom d'un membre
que vous avez sélectionné, vous devrez utiliser un alias (voir le paragraphe
suivant).
SQL
SELECT Nom, ClientID
FROM ClientTable Contact
LINQ
from Contact in ClientListe
select new { Contact.Nom, Contact.ClientID }
Utiliser un alias dans le SELECT
Toujours en SQL, il est possible de définir des alias pour les différents éléments que vous sélectionnez au niveau de la clause SELECT, ce qui permet ensuite d'utiliser ces alias pour faire référence à ces éléments. De la même façon, LINQ vous permet de donner un nom aux éléments que vous sélectionnez, ce qui vous permettra par la suite d'utiliser ce nom faire référence à ces éléments lorsque vous exploiterez le résultat de la requête LINQ.
SQL
SELECT Nom NomContact, ClientID ContactID
FROM ClientTable Contact
LINQ
from Contact in ClientListe
select new { NomContact = Contact.Nom, ContactID = Contact.ClientID }
Dans le prochain billet, je présenterai les équivalents des clauses DISTINCT, WHERE et ORDER BY pour le langage LINQ.