C # эквивалент функции IsNull() в SQL Server
-
05-07-2019 - |
Вопрос
В SQL Server вы можете использовать IsNull()
функция для проверки, является ли значение null, и если это так, возвращает другое значение.Теперь мне интересно, есть ли что-то подобное в C #.
Например, я хочу сделать что-то вроде:
myNewValue = IsNull(myValue, new MyValue());
вместо того , чтобы:
if (myValue == null)
myValue = new MyValue();
myNewValue = myValue;
Спасибо.
Решение
Это называется нулевым слиянием (??
) оператор:
myNewValue = myValue ?? new MyValue();
Другие советы
К сожалению, не существует эквивалента оператору объединения null, который работает с DBNull;для этого вам нужно использовать тернарный оператор:
newValue = (oldValue is DBNull) ? null : oldValue;
Используйте метод Equals:
object value2 = null;
Console.WriteLine(object.Equals(value2,null));
public static T isNull<T>(this T v1, T defaultValue)
{
return v1 == null ? defaultValue : v1;
}
myValue.isNull(new MyValue())
Для работы с нулевыми значениями базы данных я создал набор для своих приложений на VB.Я называю их Cxxx2, поскольку они похожи на встроенные функции Cxxx в VB.
Вы можете увидеть их в моем проекте CLR Extensions
http://www.codeplex.com/ClrExtensions/SourceControl/FileView.aspx?itemId=363867&changeSetId=17967
Вы Пишете Две функции
//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;
}
}
Они работают Очень Хорошо
Я использовал следующий метод расширения для своих типов потока данных:
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 даже не предоставит этот столбец.
Используйте приведенные ниже методы.
/// <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;
}
Это наполовину в шутку, поскольку вопрос довольно глупый.
public static bool IsNull (this System.Object o)
{
return (o == null);
}
Это метод расширения, однако он расширяет System.Object, поэтому каждый используемый вами объект теперь имеет метод IsNull().
Затем вы можете сэкономить тонны кода, выполнив:
if (foo.IsNull())
вместо супер убогого:
if (foo == null)