从行中选择时出现错误.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'。请使用可空类型..” 我怎么能纠正这个?我不希望我的datacontracts有Nullable类型,我想使用三元组或其他东西,如果值为NULL,只需使用0.这可能吗?
感谢您的帮助,
〜CK
答案 0 :(得分: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")
});
答案 1 :(得分:7)
以下是测试空值的方法......
Plaza = row.IsNull("siFkPlazaId") ? 0 : row.Field<int>("siFkPlazaId")
答案 2 :(得分:4)
如果您的财产可以为空,您也可以这样做;
Plaza = row.Field<int16?>("siFkPlazaId")
答案 3 :(得分: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;