Equivalente in C # della funzione IsNull () in SQL Server


113

In SQL Server è possibile utilizzare la IsNull()funzione per verificare se un valore è null e, in tal caso, restituire un altro valore. Ora mi chiedo se c'è qualcosa di simile in C #.

Ad esempio, voglio fare qualcosa come:

myNewValue = IsNull(myValue, new MyValue());

invece di:

if (myValue == null)
  myValue = new MyValue();
myNewValue = myValue;

Grazie.

Risposte:


204

Si chiama ??operatore null coalescing ( ):

myNewValue = myValue ?? new MyValue();

3
Ho provato a utilizzare l'operatore di coalescenza null ma ho continuato a ricevere l'errore Operatore "??" non può essere applicato agli operandi di tipo "bool?" e "int" . L'errore è stato fuorviante. Il problema era che stavo cercando di assegnare un int nella posizione dell'operando di destra a una variabile booleana. Ho dovuto cambiare da this.BinaryExists = vModel.BinaryExists ?? 0;a this.BinaryExists = vModel.BinaryExists ?? false;.
Kuyenda

14

Purtroppo, non esiste alcun equivalente all'operatore di coalescenza null che funziona con DBNull; per questo, è necessario utilizzare l'operatore ternario:

newValue = (oldValue is DBNull) ? null : oldValue;

15
Nitpick: So che molti posti si riferiscono a questo come operatore ternario. Al momento c'è un solo operatore ternario, ma è una sua proprietà, non il suo nome. È davvero l'operatore condizionale. Se C # dovesse mai ottenere un altro operatore ternario, ci saranno molti libri confusi.
Jon Skeet

puoi lanciare dbnull su un oggetto ((object) oldValue ?? (object) DBNull.Value))
Jeremy Gray

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)sarebbe equivalente a ciò ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValueche è diverso dal problema affrontato dalla soluzione di Robert Rossney.
Trisped

5
public static T isNull<T>(this T v1, T defaultValue)
{
    return v1 == null ? defaultValue : v1;
}

myValue.isNull(new MyValue())

in questo modo new MyValue()verrà eseguito anche quando myValuenon è nullo e non è richiesto !!
S.Serpooshan

4

Usa il metodo Equals:

object value2 = null;
Console.WriteLine(object.Equals(value2,null));

Questa risposta restituisce solo Vero o Falso, che non è ciò che l'OP ha chiesto.
Culme


0

Scrivi due funzioni

    //When Expression is Number
    public static double? isNull(double? Expression, double? Value)
    {
        if (Expression ==null)
        {
            return Value;
        }
        else
        {
            return Expression;
        }
    }


    //When Expression is string (Can not send Null value in string Expression
    public static string isEmpty(string Expression, string Value)
    {
        if (Expression == "")
        {
            return Value;
        }
        else
        {
            return Expression;
        }
    }

Funzionano molto bene


2
Sebbene questo frammento di codice possa risolvere il problema, non spiega perché o come risponde alla domanda. Si prega di includere una spiegazione per il codice , poiché ciò aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. Segnalatori / revisori: per risposte di solo codice come questa,
Luca Kiebel

0

Ho utilizzato il seguente metodo di estensione sui miei tipi di DataRow:

    public static string ColumnIsNull(this System.Data.DataRow row, string colName, string defaultValue = "")
    {
        string val = defaultValue;
        if (row.Table.Columns.Contains(colName))
        {
            if (row[colName] != DBNull.Value)
            {
                val = row[colName]?.ToString();
            }
        }
        return val;
    }

utilizzo:

MyControl.Text = MyDataTable.Rows[0].ColumnIsNull("MyColumn");
MyOtherControl.Text = MyDataTable.Rows[0].ColumnIsNull("AnotherCol", "Doh! I'm null");

Sto verificando prima l'esistenza della colonna perché se nessuno dei risultati della query ha un valore non nullo per quella colonna, l'oggetto DataTable non fornirà nemmeno quella colonna.


0

Usa i metodi seguenti.

    /// <summary>
    /// Returns replacement value if expression is null
    /// </summary>
    /// <param name="expression"></param>
    /// <param name="replacement"></param>
    /// <returns></returns>
    public static long? IsNull(long? expression, long? replacement)
    {
        if (expression.HasValue)
            return expression;
        else
            return replacement;
    }

    /// <summary>
    /// Returns replacement value if expression is null
    /// </summary>
    /// <param name="expression"></param>
    /// <param name="replacement"></param>
    /// <returns></returns>
    public static string IsNull(string expression, string replacement)
    {
        if (string.IsNullOrWhiteSpace(expression))
            return replacement;
        else
            return expression;
    }

0
    public static T IsNull<T>(this T DefaultValue, T InsteadValue)
    {

        object obj="kk";

        if((object) DefaultValue == DBNull.Value)
        {
            obj = null;
        }

        if (obj==null || DefaultValue==null || DefaultValue.ToString()=="")
        {
            return InsteadValue;
        }
        else
        {
            return DefaultValue;
        }

    }

//This method can work with DBNull and null value. This method is question's answer

-10

Questo è inteso per metà come uno scherzo, poiché la domanda è un po 'sciocca.

public static bool IsNull (this System.Object o)
{
   return (o == null);
}

Questo è un metodo di estensione, tuttavia estende System.Object, quindi ogni oggetto che usi ora ha un metodo IsNull ().

Quindi puoi salvare tonnellate di codice facendo:

if (foo.IsNull())

invece del super zoppo:

if (foo == null)

Questo non risponde alla domanda.
Eric Schoonover

12
Non sai cosa fa ISNULL in sql server, FlySwat.
ClayKaboom

1
Forse questo funziona in modo diverso in C #, ma so che in VB NON funzionerebbe per testare che l'oggetto è nullo come richiesto dall'OP. Ho provato io stesso. Ho creato solo un'estensione di questo tipo a System.Object. Il problema è che il metodo di estensione richiede un Objectoggetto reale su cui operare, e se l'oggetto fosse Nothing (precisamente il caso che stai cercando di testare in questo Q) non c'era nessuna istanza per la classe di estensione su cui operare e quindi sarebbe genera un'eccezione NullObject.
eidylon

@eidylon Sembra che non sia possibile accedere a un metodo di estensione su un Objectin VB. Vedi questa domanda SO o questo post sul blog .
Trisped
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.