2012-03-06 10 views
0

次のコードを使用してdataTableから結果を取得していますが、foreachループで結果のクエリを使用しているときに、「型 'System.Int64」のオブジェクトを' System.String '"コードのどこにエラーがあるのか​​教えてください。あなたのdtDetailDataTableLinqクエリの繰り返し結果

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

私はこの問題を解決し、自分のコードに2つの間違いがあることがわかりました。それらはあった;
1. Int64の代わりにStringを使用しました。文字列をInt64に置き換えると、エラーが解決されました。
2. DBNULLの場合は条件付きで使用しました。
以下はコード行です。

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

ありがとうStevenとSteve Haigh。

1

あなたがStringとしてそれを取得しようとしている一方で、タイプInt64の値が含まれているClickという名前の列が含まれています。あなたので、あなたのデータを知ることなし

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

ありがとう、スティーブン、それは問題でした。しかし、今はdbnull値の問題があります。システムは例外をスローするnull値を解析しようとしますが、その処理方法はわかりません。 –

+0

'detailRow.Field (" Clicks ")'(したがって '?')を使うことができます。 – Steven

1

言うのは難しいですが、私はあなたのクリック数の列が数値であることを推測する:へ

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

が変更に:問題は次の行にあります型パラメータをlong(64ビットint)にしたいでしょうか?

I.e.

detailRow.Field<long>("Clicks") 

多分?

これが当てはまる場合は、おそらく解析を避けるためにコードをリファクタリングすることもできます。