Feedback

C# - LINQ-Ergebnis in DataTable kopieren

Veröffentlicht von am 11/2/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();

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!