A quoi sert Linq ?8 mars 2010
Je vous propose un petit exemple de code C# mettant en avant les principales fonctionnalités de Linq.
Supposons que vous ayez un modèle de données type « Vente en ligne », avec une classe Customer représentant les clients, et une classe Order représentant une commande d’un client. Ces classes seront définies simplifiées de cette manière :
class Customer
{
public int CustomerId { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
}
class Order
{
public int CustomerId { get; set; }
public decimal Price { get; set; }
}
Les données seront peuplées à la main dans cet exemple afin d’éviter de vous écrire toute la mécanique de récupération de données qui n’est pas utile ici:
List<Customer> customers = new List<Customer>();
customers.Add(new Customer
{ CustomerId = 1, Name = "Greg", IsActive = false });
customers.Add(new Customer
{ CustomerId = 2, Name = "Olivier", IsActive = true });
customers.Add(new Customer
{ CustomerId = 5, Name = "Toto", IsActive = true });
List<Order> orders = new List<Order>();
orders.Add(new Order { CustomerId = 2, Price = 590m });
orders.Add(new Order { CustomerId = 1, Price = 4500m });
orders.Add(new Order { CustomerId = 2, Price = 128m });
orders.Add(new Order { CustomerId = 5, Price = 34m });
orders.Add(new Order { CustomerId = 5, Price = 1280m });
orders.Add(new Order { CustomerId = 5, Price = 750m });
Voici maintenant une première requête permettant de faire la liaison entre les clients actifs et leurs commandes:
var custToOrders = from c in customers
where c.IsActive
join o in orders on c.CustomerId equals o.CustomerId
select new
{
Customer = c,
Order = o
};
custToOrders est un IEnumerable d’un type anonyme. Cela nous permet d’utiliser le mot-clé var pour créer cette variable afin de ne pas avoir à définir un type juste pour cette jointure.
La requête suivante permet de calculer les totaux pour chaque client de ses commandes:
var totalPerCustomer = from l in custToOrders
group l by l.Customer into g
select new
{
Name = g.Key.Name,
Total = g.Sum(link => link.Order.Price)
};
On pourra ensuite utiliser les données du type anonyme contenant un nom de client et un montant total de commandes:
foreach (var t in totalPerCustomer)
Console.WriteLine("Name = {0}, Total = {1}", t.Name, t.Total);
Pour utiliser les fonctionnalités de Linq, vous devrez rajouter (si cela n’est pas déjà fait automatiquement par Visual Studio), une référence à System.Linq.dll ainsi qu’une instruction:
using System.Linq;
Linq permet avant tout de simplifier l’écriture de filtres et jointures de listes en C# la rendant similaire à celle d’un script SQL. Ceci améliore également la lisibilité du code.
Mais attention, contrairement aux moteurs de bases de données, C# n’optimise pas vos requêtes et certaines imbrications de select peuvent être très couteuses par rapport à des boucles foreach même moins sexy ;)
Un autre exemple sur MegaSnippets : Filter and order a list with Linq
N’hésitez pas à poser vos questions, j’y répondrai.
Aucun commentaire pour le moment. Soyez le/la premi(er/ère).