2011-08-18 160 views
1

下面的代码假设每行都有一个简单的统计费率平均值,但是要求规定导入的数据集允许空值。LINQ不检查null

下面的行没有正确地检查值,我收到错误:“ArgumentNullException未被用户代码处理,值不能为空。”

TUITIONCurr = g 
    .Where(p => !object.Equals(p.Field<double>("TUITION"),null)) 
    .DefaultIfEmpty() 
    .Average(p => p.Field<double>("TUITION")), 
+1

什么是g和p。 – msarchet

+0

您是否需要移除null(或实际上是'DBNull.Value')值,或者将它们替换为零? –

回答

1

而不是DataRow.Field方法,请尝试使用DataRow.IsNull。此外,您不需要致电DefaultIfEmpty()

例如为:

TUITIONCurr = g 
    .Where(p => !p.IsNull("TUITION")) 
    .Average(p => p.Field<double>("TUITION")), 
+0

Downvoter - 谨慎解释为什么?如果我的答案在技术上不正确,我想提醒大家。 – Donut

2

你应该比较DBNull.Value,不null

TUITIONCurr = g 
    .Where(p => !object.Equals(p.Field<double>("TUITION"), DBNull.Value)) 
    .Average(p => p.Field<double>("TUITION")); 

一旦你过滤掉空,你不需要DefaultIfEmpty()电话。

+0

'TUITIONCurr = g.Where(p =>!object.Equals(p.Field (“TUITION”),DBNull.Value))。DefaultIfEmpty()。Average(p => p.Field (“TUITION”)) )'返回相同的原始错误 – sammarcow

+0

在这种情况下,这意味着其中一个'p'实际上是'null';不知道为什么会这样,但是你应该将'g.ToList()'赋值给一个变量并且在调试器中检查它以查看序列中的实际内容。 – dlev