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]

VB.NET Komplett

Sie stehen vo der Aufgabe, individuelle Anwendungen für Windows zu schreiben. Hier ist VB.NET die optimale Sprache. Sie erlernt sich recht leicht und passt sich komplett in die .NET Umgebung von Microsoft ein. Nach der Schulung entwickeln Sie anwenderfreundliche Programme in VB.NET . Mit den objektorientierten Modellen in VB.NET erzeugen Sie außerdem wiederverwendbare Komponenten.

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

Nach dieser Schulung beherrschen Sie die Grundlagen des TFS. Sie erledigen administrative Aufgaben schnell und sicher.

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!