C#.NET DataTable分组汇总时First/Last方法抛出类型转换异常
问题解决:First()/Last()引发的类型转换异常
异常根源
你代码中的g.First()和g.Last()返回的是完整的DataRow对象,但OpeningBalance和ClosingBalance列的预期类型是Double,直接将整行对象赋值给数值类型列,必然触发类型转换失败的异常。
修正后的代码
将g.First()和g.Last()调整为提取对应列的具体数值:
DataTable ds2Sum = ds2.AsEnumerable() // 可选:若需按时间确定期初/期末,先按日期列排序(替换为你的实际日期列名) .OrderBy(r => Convert.ToDateTime(r["Date"])) .GroupBy(r => r["MaterialName"]) .Select(g => { var row = ds2.NewRow(); row["MaterialName"] = g.Key; // 提取分组内第一行的OpeningBalance列值 row["OpeningBalance"] = Convert.ToDouble(g.First()["OpeningBalance"]); row["Quantity"] = g.Sum(r => Convert.ToInt32(r["Quantity"])); // 提取分组内最后一行的ClosingBalance列值 row["ClosingBalance"] = Convert.ToDouble(g.Last()["ClosingBalance"]); return row; }).CopyToDataTable(); dataGridView2.DataSource = ds2Sum;
关键注意事项
- 明确列提取:必须通过
g.First()["ColumnName"]的形式获取目标列的数值,而非直接返回整行对象。 - 类型匹配:因目标列是Double类型,用
Convert.ToDouble()显式转换,避免隐式转换带来的类型不兼容问题。 - 排序保障:如果期初/期末是按时间顺序定义的,务必在
GroupBy前对原数据按日期列排序,否则First()和Last()的结果可能不符合业务预期(分组后的行顺序依赖原DataTable的初始顺序)。
内容的提问来源于stack exchange,提问作者Kiran Kirtane
相关产品推荐
相关产品推荐

