LINQ
Présentation de LINQ
LINQ (Language Integrated Query) est constitué d’un ensemble de fonctionnalités introduit dans le framework .NET à partir de sa version 3.5. Cette brique est constituée, d’une part, d’une bibliothèque de classes fournissant des capacités de requêtage et, d’autre part, d’un jeu d’extensions pour le langage C# permettant l’utilisation de mots-clés spécifiques pour l’écriture de requêtes avec une syntaxe proche de celle de SQL. Cette intégration entraîne un effet appréciable : la validité d’une requête est vérifiée pendant l’étape de compilation.
L’extension du langage est en fait un sucre syntaxique qui vise à simplifier l’écriture des requêtes, mais les expressions utilisant la syntaxe LINQ sont traduites par le compilateur en appels de méthodes conventionnels. On peut en déduire que toute requête LINQ peut être réécrite avec des appels de méthodes. L’inverse n’est pas vrai, certaines méthodes n’ayant pas d’équivalent dans la syntaxe LINQ. Il n’existe notamment aucun mot-clé traduisant la méthode FirstOrDefault dans l’extension LINQ de C#.
L’existence de ces deux types de syntaxe a pour avantage de laisser...
Syntaxe
Avant de détailler les différents éléments de LINQ qui peuvent être utilisés pour écrire des requêtes, nous allons étudier un premier exemple qui vous permettra de mieux comprendre ce qu’est LINQ et comment l’utiliser.
Les données sur lesquelles nous travaillerons tout au long de cette étude syntaxique de LINQ sont issues de la base de données Northwind de Microsoft. Une partie de son contenu a été extraite dans trois fichiers au format texte qui seront chargés en mémoire afin de former trois collections d’objets. Cette étape de chargement est effectuée par le code ci-dessous, que vous adapterez de manière à pointer sur le répertoire contenant les fichiers. Les fichiers de données sont disponibles en téléchargement sur le site de l’éditeur.
class Client
{
public string Identifiant { get; set; }
public string Nom { get; set; }
public string Adresse { get; set; }
public string Ville { get; set; }
public string Pays { get; set; }
public List<ProduitCommande> ProduitsCommandes { get; set; }
}
class ProduitCommande
{
public int NumeroCommande { get; set; }
//Référence du Client associé à la commande
public string IdentifiantClient { get; set; }
//Référence du Commercial associé à la commande
public int IdentifiantCommercial { get; set; }
public DateTime DateCommande { get; set; }
public string NomProduit { get; set; }
public decimal PrixUnitaire { get; set; }
public int Quantite { get; set; }
}
class Commercial
{
public int Identifiant { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
}
class Program
{
//Cette...
Entity Framework Core
Nous avons vu que LINQ sait parfaitement manipuler les objets et leurs propriétés et est en cela un outil idéal pour la manipulation de données. Pourtant, ces collections de données ont un inconvénient majeur : la fin de l’exécution de l’application implique leur perte complète. La solution la plus courante pour conserver ces données entre plusieurs lancements de l’application consiste à utiliser une base de données à laquelle est confiée la tâche de sauvegarde de ces informations.
L’objectif d’Entity Framework Core est de faire le lien entre les mondes du développement .NET et des bases de données au travers de la notion de mappage objet-relationnel.
1. Les principes du mappage objet-relationnel
Le modèle traditionnel de manipulation des données, tel qu’il existe avec ADO.NET, se révèle souvent difficile à utiliser au quotidien dès lors que le nombre de tables ou de colonnes augmente. Les lectures et écritures de données imposent alors notamment d’avoir une certaine rigueur quant à la gestion des noms et des types d’éléments. Pour remédier à ce problème, une technique de développement logiciel visant à manipuler les données en suivant le paradigme de la programmation orientée objet est apparue : le mappage objet-relationnel (souvent abrégé en ORM : Object-Relational Mapping).
a. Les principes
La technique du mappage objet-relationnel fournit un moyen d’agir sur les sources de données sans qu’il ne soit nécessaire de jongler entre un langage de programmation et un langage de requêtage, avec toute la logique de transformation que nécessite le passage des données d’un monde à l’autre.
Concrètement, le rôle d’Entity Framework Core est de permettre la traduction d’appels de méthodes (et notamment les méthodes de l’API LINQ) qui opèrent sur des collections d’objets .NET en commandes qui peuvent être interprétées et exécutées par une base de données. En retour, les données renvoyées sont automatiquement converties en objets directement utilisables au sein du code...