将select new转换为DataTable?

我使用的是.NET 3.5,需要将下面的select new结果转换为DataTable。 是否有内置的东西或任何人知道的方法可以做到这一点?

var contentList = (from item in this.GetData().Cast() select new { Title = item.GetMetaData("Title"), Street = item.GetMetaData("Street"), City = item.GetMetaData("City"), Country = item.GetMetaData("Country") }); 

简单直接的事情是使用reflection:

 var records = (from item in this.GetData().Cast() select new { Title = "1", Street = "2", City = "3", Country = "4" }); var firstRecord = records.First(); if (firstRecord == null) return; var infos = firstRecord.GetType().GetProperties(); DataTable table = new DataTable(); foreach (var info in infos) { DataColumn column = new DataColumn(info.Name, info.PropertyType); table.Columns.Add(column); } foreach (var record in records) { DataRow row = table.NewRow(); for (int i = 0; i < table.Columns.Count; i++) row[i] = infos[i].GetValue(record); table.Rows.Add(row); } 

代码可能没有预先处理,但应该给你一个大概的想法。 首先,从匿名类型获取propertyInfos并使用此元数据创建数据表模式(填充列)。 然后使用这些信息从每个对象获取值。

这是一个没有反映属性的通用解决方案。 有一个扩展方法如下

  public static DataTable ConvertToDataTable(this IEnumerable records, params Expression>[] columns) { var firstRecord = records.First(); if (firstRecord == null) return null; DataTable table = new DataTable(); List> functions = new List>(); foreach (var col in columns) { DataColumn column = new DataColumn(); column.Caption = (col.Body as MemberExpression).Member.Name; var function = col.Compile(); column.DataType = function(firstRecord).GetType(); functions.Add(function); table.Columns.Add(column); } foreach (var record in records) { DataRow row = table.NewRow(); int i = 0; foreach (var function in functions) { row[i++] = function((record)); } table.Rows.Add(row); } return table; } 

并使用where参数将是所需顺序的列名称来调用相同的内容。

 var table = records.ConvertToDataTable( item => item.Title, item => item.Street, item => item.City ); 

有一个CopyToDataTable扩展方法可以为您完成。 它位于System.Data.DataSetExtensions.dll中