Travailler avec DataTable via LINQ : du débutant au maître en 20 minutes
\n\nImaginez la situation : vous écrivez une application en C#, vous chargez des données depuis une base dans un DataTable, et ensuite… vous devez filtrer les lignes selon une condition complexe, les regrouper par date ou fusionner deux tables. Le bon vieux DataTable.Select("...") avec ses filtres sous forme de chaîne de caractères se casse à la deuxième condition, et les boucles foreach transforment le code en spaghetti.
Ça vous parle ? Alors bienvenue dans le monde des requêtes LINQ vers DataTable. C'est votre super-outil qui transforme le travail avec des données tabulaires en code élégant, lisible et puissant. Dans ce guide, nous allons tout détailler : des bases avec Where jusqu'aux Join et GroupBy avancés. C'est parti !
\n\n
Qu'est-ce que LINQ to DataSet et pourquoi en avez-vous besoin ?
\n\nLINQ (Language Integrated Query) est un langage de requête intégré à C#. Son principal atout : vous écrivez des requêtes sur n'importe quelles données (tableaux, listes, XML, bases de données) de la même manière — avec les opérateurs familiers from, where, select.
Mais avec DataTable, il y a une nuance : LINQ ne peut pas lui être appliqué directement. DataTable n'implémente pas l'interface IEnumerable<T>. La solution est la méthode AsEnumerable(), qui transforme la table en une collection d'objets DataRow. C'est avec elle que LINQ fonctionne.
Avantages de cette approche :
\n- \n
- ✅ Sécurité des types : le compilateur détecte les erreurs dans les noms de colonnes \n
- ✅ Lisibilité : le code ressemble à du SQL, mais reste du C# \n
- ✅ Puissance : filtrage, projection, regroupement, tri — en une seule ligne \n
- ✅ Performance : exécution différée (ne charge pas de données inutiles) \n
Passons directement à l'action. Ajoutez une référence à System.Data.DataSetExtensions dans votre projet (elle est généralement déjà présente) — et c'est parti.
\n\n
Préparation des données : notre table de test
\n\nPour ne pas rester dans le vague, créons un DataTable avec des données sur des produits. Le code ci-dessous est notre base pour tous les exemples :
// 1. Création de la table avec les colonnes\nDataTable products = new DataTable("Products");\nproducts.Columns.Add("Id", typeof(int));\nproducts.Columns.Add("Name", typeof(string));\nproducts.Columns.Add("Category", typeof(string));\nproducts.Columns.Add("Price", typeof(decimal));\nproducts.Columns.Add("DateAdded", typeof(DateTime));\n\n// 2. Ajout des lignes\nproducts.Rows.Add(1, "Ordinateur portable ASUS", "Électronique", 55000, DateTime.Now.AddDays(-10));\nproducts.Rows.Add(2, "Souris Logitech", "Électronique", 2500, DateTime.Now.AddDays(-5));\nproducts.Rows.Add(3, "Livre 'C# in Depth'", "Livres", 1800, DateTime.Now.AddDays(-2));\nproducts.Rows.Add(4, "Casque Sony", "Électronique", 12000, DateTime.Now.AddDays(-1));\nproducts.Rows.Add(5, "Carnet Moleskine", "Papeterie", 1200, DateTime.Now.AddDays(-20));\nproducts.Rows.Add(6, "Stylo Parker", "Papeterie", 3500, DateTime.Now.AddDays(-15));\nproducts.Rows.Add(7, "Moniteur Dell", "Électronique", 32000, DateTime.Now.AddDays(-30));\n\nNous avons maintenant 7 produits. Il est temps d'appliquer la magie de LINQ.
\n\n\n\n
Requêtes LINQ de base vers DataTable
\n\n1. Filtrage (Where) — comme SQL WHERE
\n\nSupposons que vous deviez sélectionner tous les produits coûtant plus de 10 000 roubles. Sans LINQ, vous écririez une boucle avec une vérification row["Price"]. Avec LINQ, cela ressemble à ceci :
var expensiveProducts = products.AsEnumerable()\n .Where(row => row.Field<decimal>("Price") > 10000);\n\nforeach (var row in expensiveProducts)\n{\n Console.WriteLine($"{row["Name"]} - {row["Price"]} roubles.");\n}\n// Résultat : Ordinateur portable ASUS - 55000, Casque Sony - 12000, Moniteur Dell - 32000\n\nPoint important : utilisez la méthode Field<T>("ColumnName") plutôt que la conversion directe (decimal)row["Price"]. C'est plus sûr : si la colonne est DBNull, Fie