我在这里通过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();
CopyToDataTable
与DataRow
一起工作,这就是为什么你不能使用它。
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();