C# ما يعادل وظيفة ISNULL () في خادم SQL
-
05-07-2019 - |
سؤال
في SQL Server ، يمكنك استخدام IsNull()
وظيفة للتحقق مما إذا كانت القيمة لاغية ، وإذا كانت ، إرجاع قيمة أخرى. الآن أتساءل عما إذا كان هناك أي شيء مشابه في C#.
على سبيل المثال ، أريد أن أفعل شيئًا مثل:
myNewValue = IsNull(myValue, new MyValue());
بدلاً من:
if (myValue == null)
myValue = new MyValue();
myNewValue = myValue;
شكرًا.
المحلول
يطلق عليه الفحم الفارغ (??
) المشغل أو العامل:
myNewValue = myValue ?? new MyValue();
نصائح أخرى
للأسف ، ليس هناك ما يعادل مشغل الفحم الفارغ الذي يعمل مع dbnull ؛ لذلك ، تحتاج إلى استخدام المشغل الثلاثية:
newValue = (oldValue is DBNull) ? null : oldValue;
استخدم طريقة متساوية:
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())
للعمل مع DB Nulls ، قمت بإنشاء حفنة لتطبيقات VB الخاصة بي. أسميهم CXXX2 لأنها تشبه وظائف CXXX المدمجة في VB.
يمكنك رؤيتها في مشروع ملحقات CLR الخاص بي
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;
}
}
إنهم يعملون بشكل جيد للغاية
لقد كنت أستخدم طريقة التمديد التالية على أنواع 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");
أنا أتحقق من وجود العمود أولاً لأنه إذا لم يكن لدى أي من نتائج الاستعلام قيمة غير فائقة لهذا العمود ، فلن يوفر الكائن القابل للاختراق هذا العمود.
استخدام الأساليب أدناه.
/// <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)