el uso concisa de DBNull? (¿Ternario?)
-
27-09-2019 - |
Pregunta
Parece que hay algún tipo de confusión en el operador ternario. Sé que esto ha sido abordado en otros hilos que sí, pero siempre ha sido con nullables. Además, para mi caso estoy realmente sólo en busca de una mejor manera.
Me gustaría ser capaz de utilizar
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;
pero en cambio estoy atascado con esto:
if (string.IsNullOrEmpty(dest.Id))
{
proc.Parameters[PARAM_ID].Value = DBNull.Value;
}
else
{
proc.Parameters[PARAM_ID].Value = dest.Id;
}
El operador ternario falla porque no hay conversión posible entre DBNull y la cadena, y tan tonto como parece que es objeto considerando Valor, el compilador patadas de nuevo a mí y me veo obligado a la atención. La respuesta a la versión anulable de esta pregunta es que acaba de lanzar nulo en una cadena y acabar de una vez; DBNull no se puede convertir a la cadena, aunque, por lo que no hay suerte.
¿Hay una manera más concisa para hacer esto (sin utilizar nullables, por cierto?)
Gracias!
Solución
Se podría cambiar su primera declaración a:
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
Otros consejos
El Value
propiedad es de tipo object
, por lo que debe emitir a object
, no string
:
proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
? (object)DBNull.Value
: (object)dest.Id;
O se podría añadir un método de extensión, tales como:
public static class DBNullExtensions
{
public static object AsDBNullIfEmpty(this string value)
{
if (String.IsNullOrEmpty(value))
{
return DBNull.Value;
}
return value;
}
}
Y entonces se podría decir simplemente
proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();
(Adaptado de Phil Haack )
legible y conciso, no?
¿Qué pasa con el ?? operador nulo coalescencia Más detalles sobre ?? operador
proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;