Stefans Wiki



LINQ-Abfrage in DataTable umwandeln

Problem

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;

Lösung

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 );
c-sharp/linq-abfrage_in_datatable_umwandeln.txt · Zuletzt geändert: 12.07.2011 12:33 (Externe Bearbeitung)
Quelle: http://stefanjahn.de/c-sharp:linq-abfrage_in_datatable_umwandeln
Webseite: http://stefanjahn.de