我正在使用以下代码从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);
}
答案 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。