咨询区
- Roddy Balkan: 
我想将一个外域系统中传过来的 DataTable 转成 IEnumerable,下面的代码在 ASP.NET 4.6.1 中是没有问题的。
public static IEnumerable<UserAssignmentDto> StaffAssignmentsUsingStoredProcedure(System.Data.DataTable dataTable){var data = dataTable.AsEnumerable().Select(row =>new UserAssignmentDto{Id = ((string)row["AssignmentNumber"]),Position = (string) row["EsrPositionTitle"],});return data;}但是 ASP.NET Core 中 DataTable 的扩展方法 AsEnumerable 已经被拿掉了,这就很尴尬了,请问现在我还有什么高效的方式将 DataTable 转成我需要的 IEnumerable 呢?
回答区
- Brian Ogden: 
在 ASP.NET Core 中你只能自己通过 for 循环迭代,因为在 .NET Core 中并没有实现 IEnumerable 接口,所以你使用不了 Linq 和 Foreach, 可参考如下代码:
public static IEnumerable<UserAssignmentDto> StaffAssignmentsUsingStoredProcedure(System.Data.DataTable dataTable)
{var retList = new List<UserAssignmentDto>();for(int i = 0; i < dataTable.Rows.Count; i++){var row = dataTable.Rows[i];var temp = new UserAssignmentDto(){Id = row["AssignmentNumber"],Position = row["EsrPositionTitle"]};retList.Add(temp);     }return retList;
}- N.Y: 
并没有比 for 更高效的处理方式,当然你可以使用原生的 Select 进行过滤。
DataRow[] rows= dataTable.Select();我还封装了一个扩展方法,或许能够帮到你。
public static List<T> ConvertDataTableToGenericList<T>(DataTable dt)
{var columnNames = dt.Columns.Cast<DataColumn>().Select(c => c.ColumnName).ToList();var properties = typeof(T).GetProperties();DataRow[] rows= dt.Select();return rows.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();
}点评区
虽然 .NET Core 对 DataTable 已经很不友好了,但实际场景下总有这样的需求,使用上面提供的扩展方法挺好的,学习了。