Dieses Snippet beschreibt eine Erweiterung mit der das Ergebnis einer (einfachen) LINQ-Abfrage in ein DataTable kopiert werden kann.
Verwendung:
using gfoidl.Tools.Linq;
...
DataClasses1DataContext db = new DataClasses1DataContext();
var countries =
from c in db.Countries
select new
{
c.ID,
c.Name
};
DataTable dt = countries.Linq2DataTable();
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
namespace gfoidl.Tools.Linq
{
/// <summary>
/// Erweiterungsmethoden für LINQ
/// </summary>
public static class gfLinqExtensions
{
/// <summary>
/// Konvertiert das Ergebnis einer LINQ-Abfrage in ein DataTable
/// </summary>
/// <typeparam name="T">
/// generischer Typ
/// </typeparam>
/// <param name="list">
/// Ergebnis der LINQ-Abfrage
/// </param>
/// <returns>
/// DataTable
/// </returns>
/// <example>
/// <code>
/// var countries =
/// from c in db.Countries
/// select new
/// {
/// c.ID,
/// c.Name
/// };
///
/// DataTable dt = countries.Linq2DataTable();
/// </code>
/// </example>
public static DataTable Linq2DataTable<T>(this IEnumerable<T> list)
{
// DataTable mit Namen aus GUID erstellen:
DataTable dt = new DataTable(Guid.NewGuid().ToString());
// Spaltennamen:
PropertyInfo[] cols = null;
// Ist das LINQ-Ergebnis null wird ein leeres DataTable
// zurückgegeben:
if (list == null)
return dt;
// Alle Elemente der Liste durchlaufen (LINQ-Ergebnis):
foreach (T item in list)
{
// Die Spaltennamen werden per Reflektion ermittelt.
// Wird nur beim 1. Durchlauf ermittelt:
if (cols == null)
{
// Alle Spalten ermitteln:
cols = item.GetType().GetProperties();
// Spalten durchlaufen und im DataTable die Spalten erstellen:
foreach (PropertyInfo pi in cols)
{
// Spaltentyp:
Type colType = pi.PropertyType;
if (colType.IsGenericType &&
colType.GetGenericTypeDefinition() == typeof(Nullable<>))
colType = colType.GetGenericArguments()[0];
// Spalte der DataTable hinzufügen:
dt.Columns.Add(new DataColumn(pi.Name, colType));
}
}
// Zeile hinzufügen:
DataRow dr = dt.NewRow();
foreach (PropertyInfo pi in cols)
dr[pi.Name] =
pi.GetValue(item, null) ?? DBNull.Value;
dt.Rows.Add(dr);
}
return dt;
}
}
}
Kommentare zum Snippet