C# ??具有DBNull的运算符(类似于Coalesce的结果)

时间:2014-04-28 09:08:58

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

我从DB获得DBNull结果。

试图申请?像

那样的运算符
result["field1"] ?? result["field2"]

field1 = DBNull

field2 = 4

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

试图做

result["field1"] = null

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

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


更确切地说:

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

那两个字段只是例如,实际上会有更多的字段,我试图先得到null(所以我希望使用链接field1 ?? field2 ?? field3 ......)

我对此并不精确,对不起,我的错。


遵循Peter van der Heijden解决方案,说我来自DB

结果[" field1"] = DBNull

结果[" field2"] = DBNull

结果[" field3"] = 4

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

将返回{}(首先不是null,DBNull是...... well ... not null)

但是

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

将返回结果[" field3"] = 4,如预期的那样。

INT?可以用你得到的任何结果类型替换(比如DateTime?)。

5 个答案:

答案 0 :(得分:3)

我倾向于这样做:

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

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

或者在你的情况下:

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

答案 1 :(得分:2)

您可以使用稍长的变体:

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

??仅在左操作数为nullDBNull为类null的实例时才有效。

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

的值相比更快

答案 2 :(得分:1)

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

使用其他检查,例如:

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

答案 3 :(得分:1)

DBNull.Value.Equals(result["field1"]) ? result["field2"]: result["field1"];

答案 4 :(得分:0)

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

你无法让它与??一起使用,你只能手动检查result["col"] != DBNull.Value,但显然这可以放入方法或扩展方法,所以它读得更好。

三元运算符与您将获得的距离非常接近:var val = results["col"] != DBNull.Value ? (int)results["col"] : 0;