Arbeiten mit DataTable über LINQ: Vom Anfänger zum Meister in 20 Minuten
\n\nStellen Sie sich folgende Situation vor: Sie schreiben eine Anwendung in C#, laden Daten aus der Datenbank in eine DataTable, und dann… müssen Sie Zeilen nach einer komplexen Bedingung filtern, nach Datum gruppieren oder zwei Tabellen zusammenführen. Der gute alte DataTable.Select("...") mit seinen String-Filtern scheitert an der zweiten Bedingung, und foreach-Schleifen verwandeln den Code in Spaghetti.
Kommt Ihnen das bekannt vor? Dann willkommen in der Welt der LINQ-Abfragen für DataTable. Dies ist Ihr Super-Werkzeug, das die Arbeit mit tabellarischen Daten in eleganten, lesbaren und leistungsstarken Code verwandelt. In diesem Leitfaden behandeln wir alles: von grundlegenden Where bis hin zu fortgeschrittenen Join und GroupBy. Los geht's!
\n\n
Was ist LINQ to DataSet und warum wird es benötigt?
\n\nLINQ (Language Integrated Query) ist eine in C# integrierte Abfragesprache. Ihr Hauptvorteil: Sie schreiben Abfragen für beliebige Daten (Arrays, Listen, XML, Datenbanken) auf die gleiche Weise – mit den vertrauten Operatoren from, where, select.
Bei DataTable gibt es jedoch eine Besonderheit: LINQ kann nicht direkt darauf angewendet werden. DataTable implementiert das Interface IEnumerable<T> nicht. Die Lösung ist die Methode AsEnumerable(), die die Tabelle in eine Sammlung von DataRow-Objekten umwandelt. Mit dieser arbeitet LINQ dann.
Vorteile des Ansatzes:
\n- \n
- ✅ Typsicherheit: Der Compiler erkennt Fehler in Spaltennamen \n
- ✅ Lesbarkeit: Der Code ähnelt SQL, bleibt aber C# \n
- ✅ Leistungsfähigkeit: Filterung, Projektion, Gruppierung, Sortierung – in einer Zeile \n
- ✅ Performance: Verzögerte Ausführung (lädt nichts Überflüssiges) \n
Kommen wir direkt zur Sache. Fügen Sie in Ihrem Projekt einen Verweis auf System.Data.DataSetExtensions hinzu (normalerweise bereits vorhanden) – und los geht's.
\n\n
Datenvorbereitung: Unsere Testtabelle
\n\nUm nicht nur zu reden, erstellen wir eine DataTable mit Produktdaten. Der folgende Code ist unsere Basis für alle Beispiele:
// 1. Tabelle mit Spalten erstellen\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. Zeilen hinzufügen\nproducts.Rows.Add(1, "ASUS Laptop", "Elektronik", 55000, DateTime.Now.AddDays(-10));\nproducts.Rows.Add(2, "Logitech Maus", "Elektronik", 2500, DateTime.Now.AddDays(-5));\nproducts.Rows.Add(3, "Buch 'C# in Depth'", "Bücher", 1800, DateTime.Now.AddDays(-2));\nproducts.Rows.Add(4, "Sony Kopfhörer", "Elektronik", 12000, DateTime.Now.AddDays(-1));\nproducts.Rows.Add(5, "Moleskine Notizbuch", "Bürobedarf", 1200, DateTime.Now.AddDays(-20));\nproducts.Rows.Add(6, "Parker Füller", "Bürobedarf", 3500, DateTime.Now.AddDays(-15));\nproducts.Rows.Add(7, "Dell Monitor", "Elektronik", 32000, DateTime.Now.AddDays(-30));\n\nJetzt haben wir 7 Produkte. Zeit, die Magie von LINQ anzuwenden.
\n\n\n\n
Grundlegende LINQ-Abfragen für DataTable
\n\n1. Filterung (Where) – wie SQL WHERE
\n\nAngenommen, wir möchten alle Produkte auswählen, die teurer als 10.000 Rubel sind. Ohne LINQ würden Sie eine Schleife mit einer Überprüfung von row["Price"] schreiben. Mit LINQ sieht das so aus:
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"]} Rub.");\n}\n// Ausgabe: ASUS Laptop - 55000, Sony Kopfhörer - 12000, Dell Monitor - 32000\n\nWichtiger Hinweis: Verwenden Sie die Methode Field<T>("ColumnName") anstelle der direkten Typumwandlung (decimal)row["Price"]. Dies ist sicherer: Wenn die Spalte DBNull ist, wirft Fie