【问题标题】:LINQ not checking for nullLINQ 不检查 null
【发布时间】:2011-08-18 14:20:56
【问题描述】:

以下代码应该对每行的学费率进行简单平均,但要求规定导入的数据集允许空值。

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

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

【问题讨论】:

  • 您需要删除null(或者实际上是DBNull.Value)值,还是用零替换它们?

标签: c# linq


【解决方案1】:

您应该与DBNull.Value 进行比较,而不是null

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

过滤掉空值后,就不需要调用DefaultIfEmpty()

【讨论】:

  • TUITIONCurr = g.Where(p =&gt; !object.Equals(p.Field&lt;double&gt;("TUITION"), DBNull.Value)).DefaultIfEmpty().Average(p =&gt; p.Field&lt;double&gt;("TUITION")) 返回相同的原始错误
  • 在这种情况下,这意味着p 之一实际上是null;不知道为什么会这样,但您应该将 g.ToList() 分配给一个变量并在调试器中检查它以查看序列中的实际内容。
【解决方案2】:

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

例如:

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

【讨论】:

  • Downvoter -- 想解释一下原因吗?如果我的回答在技术上不正确,我想知道。
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
相关资源
最近更新 更多