将DataTable转换为List <T>
我有一个强types的MyType
types的DataTable,我想将它转换成List<MyType>
。
我怎样才能做到这一点 ?
谢谢。
以下是单行的:
dataTable.Rows.OfType<DataRow>() .Select(dr => dr.Field<MyType>(columnName)).ToList();
[ 编辑 :如果这个不编译添加到您的项目的System.Data.DataSetExtensions
引用]
有DataTable的Linq扩展方法。
将引用添加到: System.Data.DataSetExtensions.dll
然后包含命名空间: using System.Data.DataSetExtensions
最后你可以在DataSet和DataTable上使用Linq扩展:
var matches = myDataSet.Tables.First().Where(dr=>dr.Field<int>("id") == 1);
在.Net 2.0上,你仍然可以添加通用的方法:
public static List<T> ConvertRowsToList<T>( DataTable input, Convert<DataRow, T> conversion) { List<T> retval = new List<T>() foreach(DataRow dr in input.Rows) retval.Add( conversion(dr) ); return retval; }
List<MyType> listName = dataTableName.AsEnumerable().Select(m => new MyType() { ID = m.Field<string>("ID"), Description = m.Field<string>("Description"), Balance = m.Field<double>("Balance"), }).ToList()
数据表到列表
#region "getobject filled object with property reconized" public List<T> ConvertTo<T>(DataTable datatable) where T : new() { List<T> Temp = new List<T>(); try { List<string> columnsNames = new List<string>(); foreach (DataColumn DataColumn in datatable.Columns) columnsNames.Add(DataColumn.ColumnName); Temp = datatable.AsEnumerable().ToList().ConvertAll<T>(row => getObject<T>(row, columnsNames)); return Temp; } catch { return Temp; } } public T getObject<T>(DataRow row, List<string> columnsName) where T : new() { T obj = new T(); try { string columnname = ""; string value = ""; PropertyInfo[] Properties; Properties = typeof(T).GetProperties(); foreach (PropertyInfo objProperty in Properties) { columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower()); if (!string.IsNullOrEmpty(columnname)) { value = row[columnname].ToString(); if (!string.IsNullOrEmpty(value)) { if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null) { value = row[columnname].ToString().Replace("$", "").Replace(",", ""); objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null); } else { value = row[columnname].ToString().Replace("%", ""); objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(objProperty.PropertyType.ToString())), null); } } } } return obj; } catch { return obj; } } #endregion
IEnumerable集合到Datatable
#region "New DataTable" public DataTable ToDataTable<T>(IEnumerable<T> collection) { DataTable newDataTable = new DataTable(); Type impliedType = typeof(T); PropertyInfo[] _propInfo = impliedType.GetProperties(); foreach (PropertyInfo pi in _propInfo) newDataTable.Columns.Add(pi.Name, pi.PropertyType); foreach (T item in collection) { DataRow newDataRow = newDataTable.NewRow(); newDataRow.BeginEdit(); foreach (PropertyInfo pi in _propInfo) newDataRow[pi.Name] = pi.GetValue(item, null); newDataRow.EndEdit(); newDataTable.Rows.Add(newDataRow); } return newDataTable; }
-
IEnumerable<DataRow> rows = dataTable.AsEnumerable();
(System.Data.DataSetExtensions.dll) -
IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();
(System.Core.dll)
下面发布并使用reflection的ConvertToList方法对我来说是完美的。 谢谢。
我做了一个小小的修改,使它在T属性types上进行转换。
public List<T> ConvertToList<T>(DataTable dt) { var columnNames = dt.Columns.Cast<DataColumn>() .Select(c => c.ColumnName) .ToList(); var properties = typeof(T).GetProperties(); return dt.AsEnumerable().Select(row => { var objT = Activator.CreateInstance<T>(); foreach (var pro in properties) { if (columnNames.Contains(pro.Name)) { PropertyInfo pI = objT.GetType().GetProperty(pro.Name); pro.SetValue(objT, row[pro.Name] == DBNull.Value ? null : Convert.ChangeType(row[pro.Name], pI.PropertyType)); } } return objT; }).ToList(); }
希望能帮助到你。 问候。
假设你的DataRow
是从你自己的typesinheritance的,比如说MyDataRowType
,它应该可以工作:
List<MyDataRowType> list = new List<MyDataRowType>(); foreach(DataRow row in dataTable.Rows) { list.Add((MyDataRowType)row); }
正如你在评论中所说的那样,假定你正在使用.NET 2.0,并且不能访问LINQ扩展方法。
试试这个代码,这是最简单的方法将数据表转换为列表
List<DataRow> listtablename = dataTablename.AsEnumerable().ToList();
感谢所有的post….我已经做了使用Linq查询,查看此请访问以下链接
http://codenicely.blogspot.com/2012/02/converting-your-datatable-into-list.html
通过使用AsEnumerable调用扩展数据表来创build一个带有types的列表。
var mylist = dt.AsEnumerable()。ToList();
干杯!! 快乐的编码
请试试这个代码:
public List<T> ConvertToList<T>(DataTable dt) { var columnNames = dt.Columns.Cast<DataColumn>() .Select(c => c.ColumnName) .ToList(); var properties = typeof(T).GetProperties(); return dt.AsEnumerable().Select(row => { var objT = Activator.CreateInstance<T>(); foreach (var pro in properties) { if (columnNames.Contains(pro.Name)) pro.SetValue(objT, row[pro.Name]); } return objT; }).ToList(); }
你可以将你的数据表转换为列表。 检查以下链接
https://stackoverflow.com/a/35171050/1805776
public static class Helper { public static List<T> DataTableToList<T>(this DataTable dataTable) where T : new() { var dataList = new List<T>(); //Define what attributes to be read from the class const System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance; //Read Attribute Names and Types var objFieldNames = typeof(T).GetProperties(flags).Cast<System.Reflection.PropertyInfo>(). Select(item => new { Name = item.Name, Type = Nullable.GetUnderlyingType(item.PropertyType) ?? item.PropertyType }).ToList(); //Read Datatable column names and types var dtlFieldNames = dataTable.Columns.Cast<DataColumn>(). Select(item => new { Name = item.ColumnName, Type = item.DataType }).ToList(); foreach (DataRow dataRow in dataTable.AsEnumerable().ToList()) { var classObj = new T(); foreach (var dtField in dtlFieldNames) { System.Reflection.PropertyInfo propertyInfos = classObj.GetType().GetProperty(dtField.Name); var field = objFieldNames.Find(x => x.Name == dtField.Name); if (field != null) { if (propertyInfos.PropertyType == typeof(DateTime)) { propertyInfos.SetValue (classObj, convertToDateTime(dataRow[dtField.Name]), null); } else if (propertyInfos.PropertyType == typeof(Nullable<DateTime>)) { propertyInfos.SetValue (classObj, convertToDateTime(dataRow[dtField.Name]), null); } else if (propertyInfos.PropertyType == typeof(int)) { propertyInfos.SetValue (classObj, ConvertToInt(dataRow[dtField.Name]), null); } else if (propertyInfos.PropertyType == typeof(long)) { propertyInfos.SetValue (classObj, ConvertToLong(dataRow[dtField.Name]), null); } else if (propertyInfos.PropertyType == typeof(decimal)) { propertyInfos.SetValue (classObj, ConvertToDecimal(dataRow[dtField.Name]), null); } else if (propertyInfos.PropertyType == typeof(String)) { if (dataRow[dtField.Name].GetType() == typeof(DateTime)) { propertyInfos.SetValue (classObj, ConvertToDateString(dataRow[dtField.Name]), null); } else { propertyInfos.SetValue (classObj, ConvertToString(dataRow[dtField.Name]), null); } } else { propertyInfos.SetValue (classObj, Convert.ChangeType(dataRow[dtField.Name], propertyInfos.PropertyType), null); } } } dataList.Add(classObj); } return dataList; } private static string ConvertToDateString(object date) { if (date == null) return string.Empty; return date == null ? string.Empty : Convert.ToDateTime(date).ConvertDate(); } private static string ConvertToString(object value) { return Convert.ToString(ReturnEmptyIfNull(value)); } private static int ConvertToInt(object value) { return Convert.ToInt32(ReturnZeroIfNull(value)); } private static long ConvertToLong(object value) { return Convert.ToInt64(ReturnZeroIfNull(value)); } private static decimal ConvertToDecimal(object value) { return Convert.ToDecimal(ReturnZeroIfNull(value)); } private static DateTime convertToDateTime(object date) { return Convert.ToDateTime(ReturnDateTimeMinIfNull(date)); } public static string ConvertDate(this DateTime datetTime, bool excludeHoursAndMinutes = false) { if (datetTime != DateTime.MinValue) { if (excludeHoursAndMinutes) return datetTime.ToString("yyyy-MM-dd"); return datetTime.ToString("yyyy-MM-dd HH:mm:ss.fff"); } return null; } public static object ReturnEmptyIfNull(this object value) { if (value == DBNull.Value) return string.Empty; if (value == null) return string.Empty; return value; } public static object ReturnZeroIfNull(this object value) { if (value == DBNull.Value) return 0; if (value == null) return 0; return value; } public static object ReturnDateTimeMinIfNull(this object value) { if (value == DBNull.Value) return DateTime.MinValue; if (value == null) return DateTime.MinValue; return value; } }