1

LINQ コンセプトの使用中に問題に直面しています。以下では、2 つのデータテーブルを比較しています。1 つはデータベースで埋められ、もう 1 つは Excel ファイルです。

問題は、2 つの「tempdt」の間に結合を適用すると、オブジェクトのキャスト エラーを促進する double 値が含まれている場合です。戻り値の型を string から double に変更することはできません。現在は double であり、将来的には英数字になる可能性があるため、将来的には任意のデータ型になる可能性があります。

    var commonRows = from r1 in dt.AsEnumerable()
                             join r2 in tempdt.AsEnumerable()
                             on r1.Field<string>(0) equals r2.Field<string>(4)
                             select r2;
            if (commonRows.Any())
            {
                abcdefgh = commonRows.Count();
                dt123 = commonRows.CopyToDataTable();
                // ring the ghanta of gutlu
            }

例外: タイプ 'System.Double' のオブジェクトをタイプ 'System.String' にキャストできません。

4

5 に答える 5

6

ここにあなたの問題があると思います:

from r1 in dt.AsEnumerable()
join r2 in tempdt.AsEnumerable() on
r1.Field<string>(0)  //<-- this may not be string
equals 
r2.Field<string>(4) //<-- this may not be string
select r2;

あなたができる ことは、それをオブジェクトとして扱うことです:

from r1 in dt.AsEnumerable()
join r2 in tempdt.AsEnumerable() on
(string.Empty + r1.Field<object>(0)) <-- Edited by Andreas X
equals 
(string.Empty + r2.Field<object>(4)) <-- Edited by Andreas X
select r2;

すべきこと、インデックス番号 (0 と 4) が同じ型を指していることを確認することです。

編集:私は通常、古い ASP トリックを使用して、tostring 値を要求するときに null ポインターを回避します。

于 2013-04-22T07:58:16.293 に答える
2

double と string はまったく無関係な 2 つのクラスであるため、string へのキャストは実際には不可能です。おそらく、それらの .ToString() 値を比較してみてください。または、完全に安全にしたい場合は、文字列形式を比較して、NullReferenceExceptions が発生しないようにします。string.Format("{0}", fieldvalue)

于 2013-04-22T07:53:35.990 に答える