【问题标题】:How to check DBNull value in Linq query results如何在 Linq 查询结果中检查 DBNull 值
【发布时间】:2013-10-31 16:17:32
【问题描述】:

我正在使用以下代码并尝试按货币和代码进行分组。在此之后,我尝试遍历结果集。

但问题是在遍历结果时,最后我在 for each 语句中得到以下异常:

对象不能从 DBNull 转换为其他类型。

    DataTable dt = new DataTable();

    var result = from r in dt.AsEnumerable()
               result r by new
               {
                    currency = r.Field<String>("CURRENCY"),
                    Code = r.Field<String>("CODE")
               }
              into grp
              select new
              {
                   currency = grp.Key.currency,
                   Code = grp.Key.Code,
                   amount = grp.Sum(x => Convert.ToDouble(x["AMOUNT"]))
              };

    foreach (var obj in result)
    {
      String sCurr =obj.currency;
      String Code = obj.Code;
      string amount= obj.amount.ToString());
    }

请帮我解决这个问题。

【问题讨论】:

  • 金额是实际的双精度值,还是双精度的字符串表示形式?

标签: c# linq datatable


【解决方案1】:

类似

 amount = grp.Sum(x => Convert.ToDouble(x["AMOUNT"] == DBNull.Value ? 0 : x["AMOUNT"]));

如果那是给你带来问题的那一行。

【讨论】:

  • 如果你给它一个Nullable&lt;&gt;类型参数,内置的Field扩展方法将处理DBNull.Value就好了,所以你不需要手动检查DBNull.Value。相反,您可以处理普通的 C# null,这样您就可以使用 ?? 运算符来获得更简洁的代码。
  • Thnaks Sam Ward,问题在于转换,Thom Smith 也提到过。
【解决方案2】:

使用DBNulls查找特定列的CELLS数量的方法:

int numOfEmptyColA = MyDataTable.AsEnumerable().Where(p=>p.IsNull("ColA")).Count();

【讨论】:

    【解决方案3】:

    这个:

    amount = grp.Sum(x => Convert.ToDouble(x["AMOUNT"]))
    

    不会像您期望的那样工作。如果x["AMOUNT"]DBNull.Value 而不是有效的double,则转换将失败并出现异常。相反,请尝试:

    amount = grp.Sum(x.Field<double?>("AMOUNT"))
    

    如果您希望该字段为double。根据MSDNSum 会将null 的值视为零。

    【讨论】:

    • 感谢 Thom Smith,转换是导致问题的原因
    【解决方案4】:

    我不确定哪个错误,但您可以将其与DBNull.Value 进行比较,就像这样。

    String sCurr = obj.currency == DBNull.Value ? "" : obj.currency;
    

    【讨论】:

    • 上面的代码给出了一个编译错误,比如“不能应用于'string'类型的操作数到'System.DBNull'
    • 那么它可能是金额字段。我不确定哪个得到了错误。因此,请尝试将其添加到 obj.amount 表达式中,并将其从其他两个中删除。
    • string amount= obj.currency == DBNull.Value ? "" : obj.amount.ToString();
    • 我认为语法是 String sCurr = (object)obj.currency == DBNull.Value ? "" : obj.currency;但我仍然遇到同样的错误。我为其他两个字段添加了类似的检查。但例外是在 foreach (var obj in group)
    • 您应该从前两个表达式中删除 DBNull.Value 比较。只使用它的数量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2021-08-05
    • 2011-04-05
    • 1970-01-01
    相关资源
    最近更新 更多