查看原文
其他

.NET 如何将 DataTable 转成 IEnumerable<T> ?

DotNet 2021-12-15

The following article is from NET技术问答 Author StackOverflow

咨询区


我想将一个外域系统中传过来的 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 呢?

回答区

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;  
}  

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


- EOF -

推荐阅读  点击标题可跳转
预览 C# 10 的新东西.NET Worker Service 添加 Serilog 日志.NET Core 实践篇:依赖注入应用之援军


看完本文有收获?请转发分享给更多人

推荐关注「DotNet」,提升.Net技能 

点赞和在看就是最大的支持❤️

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存