【问题标题】:C# ?? operator with DBNull (Coalesce-like result) [duplicate]C# ??具有 DBNull 的运算符(类似合并的结果)[重复]
【发布时间】:2014-04-28 09:08:57
【问题描述】:

我正在从 DB 获取 DBNull 结果。

尝试申请??运营商喜欢它

result["field1"] ?? result["field2"]

field1 = DBNull

字段2 = 4

但它不起作用,返回 {} 因为 result["field1"] 不为空(它是 DBNull)。我希望从中得到 4 个。

试过了

result["field1"] = null

首先,但它不起作用,它仍然是 DBNull 类型。

问题是如何处理这个问题,以某种方式将 DBNull 转换为 null? 怎么做 ??运算符是否使用 DBNull 值?


更准确地说:

有没有办法获得类似COALESCE的行为?

这2个字段只是举例,实际上会有更多的字段,我试图让第一个不为空(所以我希望使用链接 field1 ?? field2 ?? field3 ...)

我说得不准确,抱歉,是我的错。


解决方案

按照 Peter van der Heijden 解决方案,假设我来自 DB

结果["field1"] = DBNull

结果["field2"]= DBNull

结果["field3"] = 4

result["field1"] ?? result["field2"] ?? result["field3"]

将返回 {}(首先不为空,DBNull 是……嗯……不为空)

但是

result["field1"] as int? ?? result["field2"] as int? ?? result["field3"] as int?

将按预期返回 result["field3"] = 4。

int?可以替换为您获得的任何结果类型(例如 DateTime?)。

【问题讨论】:

  • result["field1"] == DBNull.Value ? result["field2"] : result["field1"] 是一个选项吗?
  • 用作result["field1"] == DBNull.Value ? result["field2"] : 'result["field1"]
  • 如果resultDataRow,那么你可以使用IsNull 方法。例如。 result.IsNull("field1")

标签: c# .net-4.5 ternary-operator


【解决方案1】:

我倾向于这样做:

string s = result["field1"] as string;

int? i = result["field2"] as int?;

或者在你的情况下:

string s = result["field1"] as string ?? result["field2"] as string;

【讨论】:

  • 这是个好主意 - 需要记住这一点!我猜也是 OP 的最佳解决方案...
  • 是的,它解决了我的问题。如果 result["field1"] = DBNull 那么 result["field1"] == null 是 false 但是 result["field1"] as int? == null 是真的。谢谢。
【解决方案2】:

您可以使用稍长的变体:

result["field1"] is DBNull ? result["field2"] : result["field1"];

?? 仅在左操作数是 null 并且 DBNull 是一个类的实例而不是 null 时才有效。

旁注@Amit:
is 运算符进行类型检查。您可以“在阅读时”解释它:它检查result["field1"] 的类型是否为DBNull。见HERE。这应该比与DBNull.Value 的值比较快...

【讨论】:

  • @AmitAgrawal 嗯?那是 C#。
  • @AmitAgrawal:从未听说过is 运算符?
  • 我也在问Why you using _is_
【解决方案3】:

?? 运算符仅适用于实际的 null 值,DBNull 只是一个类型,DBNull.Value 只是一个静态值,用于表示数据库中的空值。

你不能让它与??一起工作,你所能做的就是手动检查result["col"] != DBNull.Value,但显然这可以放入一个方法或扩展方法中,这样它读起来会更好一些。

三元运算符与您将得到的差不多:var val = results["col"] != DBNull.Value ? (int)results["col"] : 0;

【讨论】:

    【解决方案4】:
    DBNull.Value.Equals(result["field1"]) ? result["field2"]: result["field1"];
    

    【讨论】:

      【解决方案5】:

      ?? 运算符永远不会与 DbNull.Value 一起使用,因为它是 DbNull 的一个实例。

      为此使用其他检查,例如:

      result["field1"] != DbNull.Value ? result["field1"] : result["field2"]
      

      【讨论】:

        猜你喜欢
        • 2018-10-31
        • 2017-08-26
        • 2012-03-15
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-13
        • 2021-11-05
        相关资源
        最近更新 更多