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

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

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

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

代替:

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

谢谢。

【问题讨论】:

    标签: c# .net sql-server isnull


    【解决方案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

    【讨论】:

    【解决方案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;
            }
        }
    

    他们工作得很好

    【讨论】:

    【解决方案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 questionthis blog post
          猜你喜欢
          • 2011-04-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-14
          • 1970-01-01
          • 2021-11-18
          • 1970-01-01
          • 2012-09-15
          • 2023-04-09
          相关资源
          最近更新 更多