1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
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;
}
}
}
|