Linq和DBNull - 获取错误

Hca*_*tek 6 c# linq ienumerable null dbnull

从行中选择时出现错误.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")


                });
Run Code Online (Sandbox Code Playgroud)

大多数情况下它运行良好,但是当数据库中有NULLS时,我收到此错误"无法将DBNull.Value强制转换为'System.Int16'.请使用可空类型.."如何更正此问题?我不希望我的datacontracts有Nullable类型,我想使用三元组或其他东西,如果值为NULL,只需使用0.这可能吗?

谢谢你的帮助,
~kk

Mar*_*arc 11

您可以随时添加另一种扩展方法(未经测试):

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

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

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")


                });
Run Code Online (Sandbox Code Playgroud)


Tom*_*ers 7

以下是测试空值的方法......

Plaza = row.IsNull("siFkPlazaId") ? 0 : row.Field<int>("siFkPlazaId")
Run Code Online (Sandbox Code Playgroud)