C# 等效于 SQL Server 中的 IsNull() 函数

Posted

技术标签:

【中文标题】C# 等效于 SQL Server 中的 IsNull() 函数【英文标题】:C# equivalent of the IsNull() function in SQL Server 【发布时间】:2010-09-15 05:10:15 【问题描述】:

在 SQL Server 中,您可以使用IsNull() 函数来检查一个值是否为空,如果是,则返回另一个值。现在我想知道 C# 中是否有类似的东西。

例如,我想做这样的事情:

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

代替:

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

谢谢。

【问题讨论】:

【参考方案1】:

称为空合并 (??) 运算符:

myNewValue = myValue ?? new MyValue();

【讨论】:

我尝试使用空合并运算符,但一直收到错误 Operator '??'不能应用于“bool”类型的操作数?和'int'。该错误具有误导性。问题是我试图将右侧操作数位置的 int 分配给布尔变量。我不得不从 this.BinaryExists = vModel.BinaryExists ?? 0; 更改为 this.BinaryExists = vModel.BinaryExists ?? false;【参考方案2】:

遗憾的是,没有等效于与 DBNull 一起使用的空合并运算符;为此,您需要使用三元运算符:

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

【讨论】:

Nitpick:我知道很多地方都将其称为三元运算符。目前恰好只有一个三元运算符,但这是它的属性,而不是它的名称。它实际上是条件运算符。如果 C# 再获得一个三元运算符,那将会有很多令人困惑的书籍。 您可以将 dbnull 强制转换为对象 ((object)oldValue ?? (object)DBNull.Value)) @JeremyGray (object)oldValue ?? (object)DBNull.Value) 等同于 ((object)oldValue == null) ? (object)DBNull.Value : (object)oldValue,这与 Robert Rossney 的解决方案解决的问题不同。【参考方案3】:
public static T isNull<T>(this T v1, T defaultValue)

    return v1 == null ? defaultValue : v1;


myValue.isNull(new MyValue())

【讨论】:

这样,new MyValue() 将被执行,即使myValue 不为空且不需要它!【参考方案4】:

使用 Equals 方法:

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

【讨论】:

这个答案只返回 True 或 False,这不是 OP 要求的。【参考方案5】:

为了使用 DB Nulls,我为我的 VB 应用程序创建了一堆。我称它们为 Cxxx2,因为它们类似于 VB 的内置 Cxxx 函数。

您可以在我的 CLR 扩展项目中看到它们

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

【讨论】:

看起来他们更改了 CodePlex 上的所有 URL。试试这个:clrextensions.codeplex.com/SourceControl/changeset/view/…【参考方案6】:

你写了两个函数

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

他们工作得很好

【讨论】:

虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。 举报者/评论者: For code-only answers such as this one, downvote, don't delete!【参考方案7】:

我一直在我的 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 对象甚至不会提供该列。

【讨论】:

【参考方案8】:

使用以下方法。

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

【讨论】:

【参考方案9】:
    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)

【讨论】:

这没有回答问题。 你不知道sql server中的ISNULL是做什么的,FlySwat。 也许这在 C# 中的工作方式不同,但我知道在 VB 中这不适用于测试对象是否为空,因为 OP 正在询问。我自己试过这个。我对 System.Object 做了这样的扩展。问题是扩展方法需要一个实际的 Object 对象来操作,如果该对象是 Nothing (正是你试图在这个 Q 中测试的情况),那么扩展类没有实例可以操作并且因此它会抛出一个 NullObject 异常。 @eidylon 看起来您无法在 VB 中访问 Object 上的扩展方法。请参阅this SO question 或this blog post。

以上是关于C# 等效于 SQL Server 中的 IsNull() 函数的主要内容,如果未能解决你的问题,请参考以下文章

C# long 类型的等效 SQL Server 类型是啥?

MySQL MATCH() AGAINST() 等效于 SQL Server

等效于 SQL SERVER 的 MySQL LIMIT 子句

C# 的哪种数据类型相当于 SQL Server 中的钱? [复制]

Java 等效于 C# Linq 中的 Where 子句

SQL Server 2008 中的 SQL Server 2008 R2 中的 dm_os_volume_stats 等效项是啥?