utilizzo concisa DBNull? (Ternario?)
-
27-09-2019 - |
Domanda
Sembra che ci sia un certo tipo di confusione nella operatore ternario. So che questo è stato affrontato in altri thread così, ma è sempre stato con nullables. Inoltre, per il mio caso sono davvero solo in cerca di un modo migliore.
Mi piacerebbe essere in grado di utilizzare
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;
ma invece mi sono bloccato con questo:
if (string.IsNullOrEmpty(dest.Id))
{
proc.Parameters[PARAM_ID].Value = DBNull.Value;
}
else
{
proc.Parameters[PARAM_ID].Value = dest.Id;
}
L'operatore ternario fallisce perché non c'è alcuna conversione possibile tra DBNull e la stringa, e tanto sciocco quanto che sembra considerando valore è oggetto, i calci del compilatore di nuovo a me e io sono costretto a cure. La risposta alla versione nullable di questa domanda è di lanciare proprio nulla a corda e da fare con esso; DBNull non può essere gettato a stringa, però, così senza fortuna lì.
C'è un modo più conciso per fare questo (senza l'utilizzo di nullables, a proposito?)
Grazie!
Soluzione
Si potrebbe cambiare la vostra prima dichiarazione a:
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
Altri suggerimenti
Il Value
proprietà è di tipo object
, così si dovrebbe lanciare a object
, non string
:
proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
? (object)DBNull.Value
: (object)dest.Id;
In alternativa si potrebbe aggiungere un metodo di estensione come ad esempio:
public static class DBNullExtensions
{
public static object AsDBNullIfEmpty(this string value)
{
if (String.IsNullOrEmpty(value))
{
return DBNull.Value;
}
return value;
}
}
E poi si può solo dire che
proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();
(Adattato da Phil Haack )
leggibile e conciso, no?
Cosa succede ad usare il ?? operatore null coalescenza Maggiori informazioni su ?? operatore
proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;