1

2 つのデータ テーブルがあり、2 つのテーブルを結合して 2 つの列の違いを見つけたいのですが、null を渡すことができないため、CopyToDataTable メソッドで null が返され続け、エラーが発生します。このコードの直前に、TestOutput テーブルと ExpectedOutput テーブルにまったく同じデータがあることを確認しました。これが私のコードです:

IEnumerable<DataRow> diff =
  (from datarows1 in TestOutput.AsEnumerable()
   join datarows2 in ExpectedOutput.AsEnumerable() 
   on datarows1.Field<String>("external_id") equals datarows2.Field<String>("external_id")

   select new
   {
      KeyId = datarows1.Field<String>("external_id"),
      Difference = datarows1.Field<Decimal>("quantity") - datarows2.Field<Decimal>("quantity")
    }) as IEnumerable<DataRow>;

DataTable difference = diff.CopyToDataTable<DataRow>();

エラー メッセージ @ 最後の行:

ArgumentNullException が処理されませんでした - 値を null にすることはできません。パラメータ名:ソース

4

3 に答える 3

2

問題はas IEnumerable<DataRow>キャスト。その行を削除すると、クエリがIEnumerableではなくKeyID、プロパティとを持つ匿名型を選択していることがわかります。オペレーターはキャストを試み、そのようなキャストが不可能な場合は a を返します。それが、null 参照例外の発生元です。DifferenceasIEnumerable<DataRow>null

IEnumerable<a'>これを修正するには、 (どこa'に匿名型があるのか​​)から DataTable を設定する別の手法を見つける必要があります。

DataTable difference = new DataTable();
difference.Columns.Add("KeyID", typeof(string));
difference.Columns.Add("Difference", typeof(decimal));

foreach (var result in diff)
   difference.Rows.Add(result.KeyID, result.Difference);
于 2012-08-31T16:19:17.093 に答える
2

問題は、次の場合です。

select new {...}

DataRow ではなく、匿名クラスを作成しています。したがって、キャストするas IEnumerable<DataRow>と、null

暗黙的に型指定された変数を使用する場合:

 var diff = 
  (from datarows1 in TestOutput.AsEnumerable() 
   join datarows2 in ExpectedOutput.AsEnumerable()  
   on datarows1.Field<String>("external_id") equals datarows2.Field<String>("external_id") 

   select new 
   { 
      KeyId = datarows1.Field<String>("external_id"), 
      Difference = datarows1.Field<Decimal>("quantity") - datarows2.Field<Decimal>("quantity") 
    }); 

これにより、正しいタイプの差分が作成されます。

于 2012-08-31T16:19:38.563 に答える
0

これの代わりに匿名型を使用しました。現在のテーブル型のようselect newに継承する型を使用する必要があります。DataRow

.....
select new MyDataType
{
   external_id= datarows1.Field<String>("external_id"),
   quantity = datarows1.Field<Decimal>("quantity") 
              - datarows2.Field<Decimal>("quantity")
}) .ToList();

DataTable difference = diff.CopyToDataTable<DataRow>();

実際、あなたのキャストは有効ではなく、null に変換されます。

于 2012-08-31T16:20:16.867 に答える