咨询区
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 已经很不友好了,但实际场景下总有这样的需求,使用上面提供的扩展方法挺好的,学习了。