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


113

У SQL Server ви можете скористатися IsNull()функцією, щоб перевірити, чи є значення нульовим, а якщо воно є, повернути інше значення. Тепер мені цікаво, чи є щось подібне в C #.

Наприклад, я хочу зробити щось на кшталт:

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

замість:

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

Дякую.

Відповіді:


204

Він називається ??оператором null coalescing ( ):

myNewValue = myValue ?? new MyValue();

3
Я спробував скористатися оператором зв'язання з нулем, але продовжував отримувати помилку Оператор "??" не можна застосувати до операндів типу 'bool?' і 'int' . Помилка була оманливою. Проблема полягала в тому, що я намагався присвоїти int у позиції правого операнда булевій змінній. Мені довелося перейти з this.BinaryExists = vModel.BinaryExists ?? 0;на this.BinaryExists = vModel.BinaryExists ?? false;.
Куєнда

14

На жаль, немає еквівалента оператору злиття нуля, який працює з DBNull; для цього вам потрібно скористатися потрійним оператором:

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

15
Нітпік: Я знаю, що багато місць називають це третинним оператором. Наразі існує лише один потрійний оператор, але це властивість, а не його назва. Це дійсно умовний оператор. Якщо C # коли-небудь придбає іншого потрійного оператора, буде багато заплутаних книг.
Джон Скіт

ви можете кинути dbnull на об’єкт ((об'єкт) 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це недійсне і воно не потрібно !!
С.Серпоошан

4

Використовуйте метод рівних:

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

Ця відповідь повертає лише Істинне чи Неправдиве, чого не вимагає ОП.
Culme

1

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

Ви можете побачити їх у моєму проекті розширень 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
Хоча цей фрагмент коду може вирішити проблему, він не пояснює, чому або як він відповідає на питання. Додайте пояснення до свого коду , оскільки це дійсно допомагає покращити якість вашої публікації. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду. Флаггери / рецензенти: Для відповідей, що стосуються лише коду, таких як ця, downvote, не видаляйте!
Лука Кібель

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, FlySwat.
ClayKaboom

1
Можливо, це працює інакше в C #, але я знаю, що в VB це НЕ буде працювати для тестування об'єкта недійсним, оскільки про це запитує ОП. Я сам спробував це. Я зробив саме таке розширення до System.Object. Проблема полягає в тому, що метод розширення вимагає фактичного Objectоб'єкта, над яким працюватимуть, і якщо об'єктом було нічого (саме те, що ви намагаєтеся перевірити в цьому Q), не було жодного примірника для роботи класу розширення, і таким чином він би кинути виняток NullObject.
ейдилон

@eidylon Схоже, ви не можете отримати доступ до методу розширення на V Objectв VB. Дивіться це питання ТА чи цю публікацію в блозі .
Trisped
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.