NET问答: 如何将 DataTable 转成 IEnumerable<T> ?

在ASP.NET 4.6.1中,可以方便地将DataTable转换为IEnumerable,但在ASP.NET Core中由于缺少AsEnumerable扩展方法,需要手动实现。BrianOgden提供了使用for循环的方法,而N.Y分享了一个自定义的扩展方法,通过反射将DataTable转换为泛型列表。这些方法在.NET Core中处理DataTable转换时提供了替代方案。
摘要由CSDN通过智能技术生成

咨询区

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值