我试图在linq中总结DataTable列。但是当程序运行时,foreach循环没有执行。如果列名等于数据表,我已经检查了数百万次。
resultDataTable.Columns.Add("User ID");
resultDataTable.Columns.Add("Amount");
resultDataTable.Columns.Add("Order number");
var query = from row in result.AsEnumerable()
group row by row.Field<string>("User ID") into grp
select new
{
Id = grp.Key,
Sum = grp.Sum(r => r.Field<int>("Amount")),
Sum2 = grp.Sum(r => r.Field<int>("Order number"))
};
foreach(var item in query)
{
resultDataTable.Rows.Add(item.Id, item.Sum, item.Sum2);
}
结果是DataTable有3列。第一个是姓名,第二个是数字,第三个是数字。
为什么这不起作用的任何想法?
答案 0 :(得分:0)
我假设您通过手动添加列以与目标表相同的方式创建了源表。然后我猜他们还包含String
- 列而不是int
列。请注意,默认值为String
。
因此,下面创建并添加三个类型为string的列:
resultDataTable.Columns.Add("User ID");
resultDataTable.Columns.Add("Amount");
resultDataTable.Columns.Add("Order number");
而是使用重载:
resultDataTable.Columns.Add("User ID");
resultDataTable.Columns.Add("Amount", typeof(int));
resultDataTable.Columns.Add("Order number", typeof(int));
为什么这很重要?因为您不能使用Sum = grp.Sum(r => r.Field<int>("Amount"))
,因为该列的类型不是int
而是string
,并且您将获得运行时{{1}在InvalidCastException
的{{3}}中。}也许你有一个空的foreach
某个地方吞下这个例外,应该避免。
创建表和列的更好方法是,如果目标表具有相同的列,则使用try...catch
:
DataTable.Clone