迭代Linq查询的结果

时间:2012-03-06 15:01:27

标签: asp.net linq

我正在使用以下代码从dataTable获取结果,但是在foreach循环中使用结果查询时,它会引发异常:“无法将'System.Int64'类型的对象强制转换为'System.String'” 。请指导我在代码中出错的地方。

var query = from detailRow in dtDetail.AsEnumerable() 
group detailRow by detailRow.Field<string>("Domain") into grouping
select new
{
   Domain = grouping.Key,
   Impressions = grouping.Count(),
   Clicks = 
   grouping.Sum(detailRow => int.Parse(detailRow.Field<string>("Clicks").ToString())),
   url = grouping.First<DataRow>()
}; 

foreach (var detailRowGroup in query)
{
  console.wirteline(detailRowGroup.Domain + detailRowGroup.Impressions + detailRowGroup.Clicks + detailRowGroup.url);

 }

3 个答案:

答案 0 :(得分:1)

dtDetail DataTable包含一个名为Click的列,其中包含Int64类型的值,而您尝试将其检索为String。问题出在以下几行:

int.Parse(detailRow.Field<string>("Clicks").ToString())

将其更改为:

int.Parse(detailRow.Field<Int64>("Clicks").ToString())

答案 1 :(得分:1)

在不知道你的数据的情况下很难说,但我猜你的Clicks列是数字的,所以你希望type参数在long(64位int)?

detailRow.Field<long>("Clicks")

可能?

如果这是真的,那么你可以重构你的代码以避免解析。

答案 2 :(得分:0)

我解决了这个问题,发现我的代码中有两个错误。那些是;
1。我在Int64的地方使用了String。通过用Int64替换String,错误已解决。
2。对于DBNULL我使用if条件。
以下是代码行;

Clicks = grouping.Sum(detailRow => Int64.Parse(detailRow.IsNull("Clicks") ? "0" : detailRow.Field<Int64>("Clicks").ToString())),

感谢Steven和Steve Haigh。