在ASP.NET Core 2.0中将DataTable转换为IEnumerable <T>

Rod*_*kan 13 c# linq asp.net asp.net-core

我需要从另一个系统的输入中生成一个来自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;
    }
Run Code Online (Sandbox Code Playgroud)

但是,'DataTable'不再包含ASP.NET Core 2.0中'AsEnumerable'的定义.

什么是最有效的方法来生成我需要的'IEnumerable'?

Ste*_*veD 10

这是一个通用的AsEnumerable扩展函数,用于模仿经典AsEnumerable()所做的事情,从DataTable返回一个DataRows的Enumerable集合。对于希望在将代码移植到.net核心时尽量减少重构量的人很有用。

    public static IEnumerable<DataRow> AsEnumerable(this DataTable table)
    {
        for (int i = 0; i < table.Rows.Count; i++)
        {
            yield return table.Rows[i];
        }
    }
Run Code Online (Sandbox Code Playgroud)


Nas*_*efi 9

不是最有效的方法,而是一种替代方法,可以使用以下Select方法:

DataRow[] rows= dataTable.Select();
Run Code Online (Sandbox Code Playgroud)

现在您有了一个IEnumerable行。此方法可以帮助某人:

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();
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*age 6

.net核心2的正确nuget软件包是 System.Data.DataSetExtensions


Bri*_*den 4

您可以做的最有效的事情之一就是自己编写迭代代码,使用 for 循环而不是 LINQ,只需迭代 DataTable 行并IEnumerable<UserAssignmentDto>“手动”构建/水合方法返回值。

由于 DataTable 没有在 .NET Core 2.0 中实现枚举器,因此您将需要使用“常规”for循环来迭代行。您无法使用foreach,因为 DataTable 在 .NET Core 2.0 中尚未实现 IEnumerable。

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;
}
Run Code Online (Sandbox Code Playgroud)