Seit C# 3.0 kann man ja via LINQ eine Datenbank abfragen. Eine schöne Sache. Ab und zu, für bestimmte Zwecke, benötigt man aber immer noch die Ergebnisse als klassische DataTable
. Wie wandelt man nun das Ergebnis einer LINQ-Abfrage in eine DataTable
um?
Hier die LINQ-Abfrage die mir mein Adressbuch ausliest:
DataContext context = new DataContext(); var query = from s in context.Personen orderby s.Nachname select s;
Die Datensätze hat man nun in query
. Man könnte jetzt nun mit foreach jeden einzelnen Datensatz abfragen und in eine DataTable
ablegen. Es geht aber noch etwas einfacher:
using System; using System.Data; using System.Data.SqlClient; using System.Linq; /// <summary> /// Ergebnis einer LINQ-Abfrage in eine DataTable umwandeln. /// </summary> /// <param name="query">Abfrageergebnis</param> /// <param name="context">Context</param> /// <returns>Tabelle</returns> public DataTable ConvertLinqToDatatable( IQueryable query, DataContext context ) { DataTable table = null; IDbCommand cmd = null; SqlDataAdapter adapter = null; try { // LINQ-Abfrage in Tabelle speichern cmd = context.GetCommand( query ); adapter = new SqlDataAdapter(); adapter.SelectCommand = (SqlCommand)cmd; table = new DataTable(); cmd.Connection.Open(); adapter.FillSchema( table, SchemaType.Source ); adapter.Fill( table ); return table; } catch { throw; } finally { if ( table != null ) table.Dispose(); if ( adapter != null ) adapter.Dispose(); if ( cmd != null ) { cmd.Connection.Close(); cmd.Dispose(); } } }
Somit einfach wie gewohnt eine LINQ-Abfrage durchführen und dann das Ergbnis mit der Funktion ConvertLinqToDatatable()
umwandeln lassen:
DataContext context = new DataContext(); var query = from s in context.Personen orderby s.Nachname select s; DataTable = ConvertLinqToDatatable( query, context );