将DataTable转换为LINQ匿名类型

我想要一个函数,它接受一个数据表并返回一个List(对象不是DataRow)例如。 :

我知道我可以这样做(但这需要知道列名称):

// Datatable dt = Filled from a Database query & has 3 columns Code,Description & ShortCode List rtn = new List(); var x = from vals in dt.Select() select new { Code = vals["Code"], Description = vals["Description"], ShortCode = vals["ShortCode"], }; rtn.AddRange(x) return rtn; 

我想要的是一个通用版本,以便我可以传入任何数据表,它将根据数据表中的列名生成。

由于在编译时不知道属性名称,并且您希望将数据用于JSON序列化,因此可以使用以下命令创建字典列表。 如果使用Newtonsoft JSON,则序列化负责转换JSON对象格式的键值对。

 IEnumerable> result = dt.Select().Select(x => x.ItemArray.Select((a, i) => new { Name = dt.Columns[i].ColumnName, Value = a }) .ToDictionary(a => a.Name, a => a.Value)); 

为了动态创建属性以便使用不同的Columns集处理不同的dataTable,我们可以使用System.Dynamic.ExpandoObject 。 它基本上实现了IDictionary 。 格式,可以很容易地转换为JSON。

  int colCount = dt.Columns.Count; foreach (DataRow dr in dt.Rows) { dynamic objExpando = new System.Dynamic.ExpandoObject(); var obj = objExpando as IDictionary; for (int i = 0; i < colCount; i++) { string key = dr.Table.Columns[i].ColumnName.ToString(); string val = dr[key].ToString(); obj[key] = val; } rtn.Add(obj); } String json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(rtn); 

您可以使用以下通用function: –

 private static List ConvertDataTable(DataTable dt) { List data = newList(); foreach (DataRowrow in dt.Rows) { Titem = GetItem(row); data.Add(item); } return data; } private static TGetItem(DataRow dr) { Type temp = typeof(T); T obj =Activator.CreateInstance(); foreach (DataColumncolumn in dr.Table.Columns) { foreach (PropertyInfopro in temp.GetProperties()) { if (pro.Name == column.ColumnName) pro.SetValue(obj,dr[column.ColumnName], null); else continue; } } return obj; } 

请查看我的文章 ,该文章已经完整演示了如何使用这种通用方法。