2012-03-06 114 views
0

我正在使用下面的代碼來獲得一個dataTable的結果,但在foreach循環中使用生成的查詢時,它會引發異常:「無法強制類型爲'System.Int64'的對象鍵入' System.String'」。請指導我在代碼錯誤的地方。Linq查詢的迭代結果

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.我在Int64的地方使用了String。通過用Int64替換String,解決了錯誤。
2.對於DBNULL,我使用條件。
以下是代碼行;

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

謝謝史蒂芬和史蒂夫海格。

1

dtDetailDataTable包含列,命名爲Click包含Int64類型的值,當你試圖將其恢復爲String。問題出在下面一行:

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

將其更改爲:

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

謝謝史蒂文,那就是問題所在。但現在還有一個問題,那就是dbnull值。當系統試圖解析一個空值時,它會拋出異常,不知道如何處理它。 – 2012-03-07 03:14:31

+0

您可以執行'detailRow.Field (「Clicks」)'(因此使用'?')。 – Steven 2012-03-07 08:43:27

1

不知道你的數據很難說,但我猜想,你的點擊次數列是數字,所以你會希望類型參數在long(64位整數)?

I.e.

detailRow.Field<long>("Clicks") 

也許?

如果這是真的,那麼你可以重構你的代碼以避免解析。