Эквивалент C # функции IsNull () в SQL Server


113

В SQL Server вы можете использовать эту IsNull()функцию, чтобы проверить, является ли значение нулевым, и, если это так, вернуть другое значение. Теперь мне интересно, есть ли что-нибудь подобное в C #.

Например, я хочу сделать что-то вроде:

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

вместо того:

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

Спасибо.

Ответы:


204

Это называется нулевым ??оператором coalescing ( ):

myNewValue = myValue ?? new MyValue();

3
Я пытался использовать оператор объединения с нулем, но продолжал получать ошибку Operator '??' не может применяться к операндам типа 'bool?' и int . Ошибка вводила в заблуждение. Проблема заключалась в том, что я пытался назначить int в позиции правого операнда логической переменной. Пришлось сменить с this.BinaryExists = vModel.BinaryExists ?? 0;на this.BinaryExists = vModel.BinaryExists ?? false;.
Kuyenda,

14

К сожалению, нет эквивалента оператору объединения NULL, который работает с DBNull; для этого вам нужно использовать тернарный оператор:

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

15
Нитпик: Я знаю, что во многих местах это называется тернарным оператором. В настоящий момент существует только один тернарный оператор, но это его свойство, а не его имя. Это действительно условный оператор. Если C # когда-нибудь получит еще один тернарный оператор, будет много запутанных книг.
Джон Скит,

вы можете преобразовать dbnull в объект ((object) oldValue ?? (object) DBNull.Value))
Джереми Грей

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)будет эквивалентен тому, ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValueчто решает проблема, которую решает Роберт Россни.
Trisped

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

myValue.isNull(new MyValue())

таким образом, new MyValue()будет выполняться, даже если myValueне равно нулю и это не требуется !!
S.Serpooshan

4

Используйте метод Equals:

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

Этот ответ возвращает только True или False, чего не просил OP.
Culme

1

Для работы с DB Nulls я создал связку своих VB приложений. Я называю их Cxxx2, поскольку они похожи на встроенные в VB функции Cxxx.

Вы можете увидеть их в моем проекте расширений CLR.

http://www.codeplex.com/ClrExtensions/SourceControl/FileView.aspx?itemId=363867&changeSetId=17967


Похоже, они изменили все URL-адреса на CodePlex. Попробуйте это: clrextensions.codeplex.com/SourceControl/changeset/view/…
Джонатан Аллен,

0

Вы пишете две функции

    //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;
        }
    }

Они работают очень хорошо


2
Хотя этот фрагмент кода может решить проблему, он не объясняет, почему и как он отвечает на вопрос. Пожалуйста, включите объяснение вашего кода , так как это действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода. Отметившие / обозреватели: для ответов только с кодом, таких как этот, голосуйте против, не удаляйте!
Лука Кибель

0

Я использовал следующий метод расширения для своих типов 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;
    }

использование:

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

Сначала я проверяю наличие столбца, потому что, если ни один из результатов запроса не имеет ненулевого значения для этого столбца, объект DataTable даже не предоставит этот столбец.


0

Используйте нижеприведенные методы.

    /// <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

Это наполовину шутка, поскольку вопрос довольно глупый.

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

Это метод расширения, однако он расширяет System.Object, поэтому каждый используемый вами объект теперь имеет метод IsNull ().

Тогда вы можете сэкономить массу кода, выполнив:

if (foo.IsNull())

вместо супер хромого:

if (foo == null)

Это не отвечает на вопрос.
Эрик Шуновер,

12
Вы не знаете, что делает ISNULL в sql server, FlySwat.
ClayKaboom

1
Возможно, это работает по-другому в C #, но я знаю, что в VB это НЕ сработает для проверки того, что объект имеет значение null, о котором спрашивает OP. Я сам пробовал. Я сделал такое расширение для System.Object. Проблема заключается в том, что для метода расширения требуется реальный Objectобъект, с которым можно работать, и если объект был Nothing (именно тот случай, который вы пытаетесь проверить в этом Q), не было экземпляра для класса расширения для работы, и, следовательно, он бы выбросить исключение NullObject.
eidylon

@eidylon Похоже, вы не можете получить доступ к методу расширения Objectв VB. См. Этот вопрос SO или это сообщение в блоге .
Trisped
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.