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]

ASP.NET 2.0 und 3.5

Dieser Kurs vermittelt Ihnen alle Erweiterungen von Microsoft ASP.NET 2.0. Zu diesen zählen u. a. Data Bindung, Master Pages, und Security.

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

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!