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



我在这里通过LINQ对DataTable分组数据,但我试图使用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>,你可以创建自己的扩展方法,参见:转换通用列表/枚举到数据表?

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();

最新更新