Linq查询未正确执行

时间:2016-01-28 12:47:53

标签: c# linq datatable

我试图在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列。第一个是姓名,第二个是数字,第三个是数字。

为什么这不起作用的任何想法?

1 个答案:

答案 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