6

从 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

4

4 回答 4

11

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

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


                });
于 2010-06-29T23:32:48.847 回答
7

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

Plaza = row.IsNull("siFkPlazaId") ? 0 : row.Field<int>("siFkPlazaId")
于 2010-06-29T23:20:00.390 回答
4

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

Plaza = row.Field<int16?>("siFkPlazaId")
于 2011-07-28T18:40:51.617 回答
1

我非常喜欢??运营商:

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;
于 2012-08-07T17:08:46.280 回答