【问题标题】:Linq and DBNull - Getting errorLinq 和 DBNull - 出现错误
【发布时间】:2010-06-29 23:13:20
【问题描述】:

从 rows.AsEnumerable() 中选择时出现错误。我正在使用以下代码...

var rows = ds.Tables[0].AsEnumerable();
                trafficData = rows.Select(row => new tdDataDC
                {
                    CalculationCount = row.Field<Int64>("biCalculationCountSeqID")
                    , Zone = row.Field<Int16>("siFkZoneId")
                    , Miles = row.Field<decimal>("dcMiles")
                    , Plaza = row.Field<Int16>("siFkPlazaId")
                    , VehicleCount = row.Field<int>("iVehicleCount")


                });

大多数情况下它运行良好,但是当数据库中有 NULLS 时,我收到此错误“无法将 DBNull.Value 转换为类型 'System.Int16'。请使用可为空的类型..” 我该如何纠正?我不希望我的数据契约具有 Nullable 类型,我想使用三元或其他类型,如果值为 NULL,则使用 0。这可能吗?

感谢您的帮助,
~ck

【问题讨论】:

    标签: c# linq null ienumerable dbnull


    【解决方案1】:

    您总是可以添加另一个扩展方法(未经测试):

       public static T FieldOrDefault<T>(this DataRow row, string columnName)
       {
           return row.IsNull(columnName) ? default(T) : row.Field<T>(columnName);   
       }
    

    然后你的呼叫站点看起来像:

    var rows = ds.Tables[0].AsEnumerable();
                    trafficData = rows.Select(row => new tdDataDC
                    {
                        CalculationCount = row.FieldOrDefault<Int64>("biCalculationCountSeqID")
                        , Zone = row.FieldOrDefault<Int16>("siFkZoneId")
                        , Miles = row.FieldOrDefault<decimal>("dcMiles")
                        , Plaza = row.FieldOrDefault<Int16>("siFkPlazaId")
                        , VehicleCount = row.FieldOrDefault<int>("iVehicleCount")
    
    
                    });
    

    【讨论】:

    • 我喜欢 Marc 的回答,但为了获得另一种方法,您可以将值类型更改为可为空(短?长?等),然后合并,例如 row.Field(“富”)?? 0
    • 顺便说一句,如果 T 始终是值类型,而不是进行 2 行调用,您可以执行 row.Field>(columnName) ?? default(T) 虽然我怀疑如果你也使用引用类型是否值得麻烦:)
    【解决方案2】:

    这是您测试空值的方法...

    Plaza = row.IsNull("siFkPlazaId") ? 0 : row.Field<int>("siFkPlazaId")
    

    【讨论】:

      【解决方案3】:

      如果您的属性可以为空,您也可以这样做;

      Plaza = row.Field<int16?>("siFkPlazaId")
      

      【讨论】:

        【解决方案4】:

        我非常喜欢 ?? 运算符:

        CalculationCount = row.Field<Int64?>("biCalculationCountSeqID") ?? 0
                        , Zone = row.Field<Int16?>("siFkZoneId") ?? 0
                        , Miles = row.Field<decimal?>("dcMiles") ?? 0.0m
                        , Plaza = row.Field<Int16?>("siFkPlazaId") ?? 0
                        , VehicleCount = row.Field<int>("iVehicleCount") 0;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多