1

我有两个数据表,想加入这两个表以找出两列之间的差异,但是它不断返回 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 未处理 - 值不能为空。参数名称:来源

4

3 回答 3

2

问题在于as IEnumerable<DataRow>演员阵容。如果您删除该行,您将看到您的查询正在选择具有属性KeyID和的匿名类型Difference,而不是IEnumerable。as运算符尝试进行转换,如果不可能进行这种转换,则IEnumerable<DataRow>返回 a 。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 回答