我从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?)。
答案 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"];
??
仅在左操作数为null
且DBNull
为类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;