Feedback

C# - LINQ-Ergebnis in DataTable kopieren

Veröffentlicht von am 02.11.2008
(4 Bewertungen)
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();

GFU-Schulungen  [Anzeige]

C# 2017/2015/2013 Grundlagen

Nach Abschluss des Kurses sind Ihnen die Datentypen und Klassenbibliotheken von C# bekannt. Außerdem sind Sie in der Lage, mit Variablen umzugehen und deren Typen zu konvertieren. Sie definieren Namespaces und setzen diese ein, Sie erstellen eigene Klassen  und bauen Trouble Shooting ein.

Visual Studio Team Foundation Server 2017/2015 (TFS) für Entwickler - Kompakt

Nach Teilnahme an dieser Schulung kennen Sie alle wesentlichen Funktionen des TFS für Entwickler. Sie setzen Software-Entwicklung mit dem Visual Studio Team Foundation Server erfolgreich um.

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;
		}
	}
}
Abgelegt unter LINQ, DataTable.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!