เทียบเท่า 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
ฉันพยายามใช้ตัวดำเนินการเชื่อมต่อแบบ null แต่ยังคงได้รับข้อผิดพลาดOperator '??' ไม่สามารถใช้กับตัวถูกดำเนินการประเภท 'bool?' และ 'int' ข้อผิดพลาดทำให้เข้าใจผิด ปัญหาคือฉันพยายามกำหนด int ในตำแหน่งตัวถูกดำเนินการด้านขวามือให้กับตัวแปรบูลีน ฉันต้องเปลี่ยนจากthis.BinaryExists = vModel.BinaryExists ?? 0;เป็นthis.BinaryExists = vModel.BinaryExists ?? false;.
Kuyenda

14

น่าเศร้าที่ไม่มีตัวดำเนินการเชื่อมต่อว่างที่เทียบเท่ากับ DBNull สำหรับสิ่งนั้นคุณต้องใช้ตัวดำเนินการ ternary:

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

15
Nitpick: ฉันรู้ว่าสถานที่หลายแห่งอ้างถึงสิ่งนี้ว่าเป็นตัวดำเนินการด้านท้าย ขณะนี้มีตัวดำเนินการ ternary เพียงตัวเดียว แต่นั่นเป็นคุณสมบัติของมันไม่ใช่ชื่อของมัน มันเป็นตัวดำเนินการตามเงื่อนไขจริงๆ หาก C # เคยได้รับตัวดำเนินการ ternary อื่นจะมีหนังสือที่สับสนมากมาย
Jon Skeet

คุณสามารถโยน dbnull ให้กับวัตถุ ((object) oldValue ?? (object) DBNull.Value))
Jeremy Grey

1
@JeremyGray (object)oldValue ?? (object)DBNull.Value)จะเท่าเทียม((object)oldValue == null) ? (object)DBNull.Value : (object)oldValueกันซึ่งแตกต่างจากที่อยู่โซลูชันของ Robert Rossney
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

ใช้วิธีการเท่ากับ:

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

คำตอบนี้จะส่งคืนเฉพาะ True หรือ False ซึ่งไม่ใช่สิ่งที่ OP ขอ
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/…
Jonathan Allen

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
แม้ว่าข้อมูลโค้ดนี้จะช่วยแก้ปัญหาได้ แต่ก็ไม่ได้อธิบายว่าทำไมหรือตอบคำถามได้อย่างไร โปรดใส่คำอธิบายสำหรับโค้ดของคุณเนื่องจากจะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้มาก โปรดจำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและบุคคลเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำโค้ดของคุณ ผู้ตั้งค่าสถานะ / ผู้ตรวจสอบ: สำหรับคำตอบที่ใช้รหัสเท่านั้นเช่นคำตอบนี้ลงคะแนนอย่าลบ!
Luca Kiebel

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)

สิ่งนี้ไม่ตอบคำถาม
Eric Schoonover

12
คุณไม่รู้ว่า ISNULL ในเซิร์ฟเวอร์ sql ทำอะไร FlySwat
ClayKaboom

1
บางทีสิ่งนี้อาจทำงานแตกต่างกันใน C # แต่ฉันรู้ว่าใน VB สิ่งนี้จะไม่ได้ผลสำหรับการทดสอบวัตถุเป็นโมฆะเนื่องจาก OP กำลังถามถึง ฉันพยายามด้วยตัวเอง ฉันสร้างส่วนขยายดังกล่าวให้กับ System.Object ปัญหาคือวิธีการขยายต้องใช้Objectออบเจ็กต์จริงในการใช้งานและถ้าอ็อบเจ็กต์นั้นไม่มีอะไร (เป็นกรณีที่คุณพยายามทดสอบใน Q นี้) ไม่มีอินสแตนซ์สำหรับคลาสส่วนขยายที่จะทำงานดังนั้นมันจะ โยนข้อยกเว้น NullObject
eidylon

@eidylon ดูเหมือนว่าคุณไม่สามารถเข้าถึงวิธีการขยายบน a Objectใน VB ได้ ดูคำถาม SO นี้หรือโพสต์บล็อกนี้
Trisped
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.