C# 在按 LINQ 和数据表对字段进行分组时无法使用 CopyToDataTable() 函数

C# Not able to use CopyToDataTable() function when grouping fields by LINQ & Datatable

在这里,我在 DataTable 上通过 LINQ 对数据进行分组,但我试图使用 CopyToDataTable(),这在我这边是不可用的。请查看我的代码并告诉我我在代码中遗漏了什么 CopyToDataTable() 不可用。

DataTable perioddata = ds.Tables[1].AsEnumerable()
     .GroupBy(a => new
     {
        NewPeriod = a.Field<string?>("NewPeriod").ToString(),
        PeriodOrder = a.Field<int>("PeriodOrder").ToString().ToInt32()
     })
     .Select(b => new PeriodDto
     {
        NewPeriod = b.Key.NewPeriod,
        PeriodOrder = b.Key.PeriodOrder
     }).CopyToDataTable();

CopyToDataTableDataRow 一起工作,这就是为什么你不能使用它的原因。

DataTable CopyToDataTable<T>(this IEnumerable<T> source) where T : DataRow

既然你有IEnumerable<PeriodDto>,你可以创建自己的扩展方法,见:Convert generic List/Enumerable to DataTable?

public static DataTable ToDataTable<T>(this IList<T> data)
{
    PropertyDescriptorCollection props =
        TypeDescriptor.GetProperties(typeof(T));
    DataTable table = new DataTable();
    for(int i = 0 ; i < props.Count ; i++)
    {
        PropertyDescriptor prop = props[i];
        table.Columns.Add(prop.Name, prop.PropertyType);
    }
    object[] values = new object[props.Count];
    foreach (T item in data)
    {
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = props[i].GetValue(item);
        }
        table.Rows.Add(values);
    }
    return table;        
}

不使用通用扩展方法并使用 PeriodDto 定义作为预期的 DataRow 定义

DataTable perioddata = ds.Tables[1].AsEnumerable()
   .GroupBy(a => new
   {
       NewPeriod = a.Field<string>("NewPeriod").ToString(),
       PeriodOrder = a.Field<int>("PeriodOrder")
   })
   .Select(b => { 
       DataRow row = ds.Tables[1].NewRow();
       row["NewPeriod"] = b.Key.NewPeriod;
       row["PeriodOrder"] = b.Key.PeriodOrder;
       return row;
   }).CopyToDataTable();