0

我有这个查询表达式,用于连接一些值以进行数据验证

result.AddRange(from string dr in ercDt
   select dc.Ordinal.ToString() + "|" + dr);

拥有那个 ercDt[0] 是 DBNull,并且没有更多的行,我收到了这个错误

无法将“System.DBNull”类型的对象转换为“System.String”类型。

我试过这个

result.AddRange(from string dr in ercDt
where dr.Any(x => x != null)
select dc.Ordinal + "|" + dr);

和这个

result.AddRange(from string dr in ercDt
where ercDt.Any(x => x != null)
select dc.Ordinal + "|" + dr);

和这个

result.AddRange(from string dr in ercDt
where !(dr is DBNull)
select dc.Ordinal + "|" + dr);

而且没有运气,

如何防止此错误发生?我根本不需要查询空值,所以在这种情况下我想要的输出将是没有记录。

谢谢

编辑:

基于混淆,我将更好地描述我的案例:

'ercDt' 是一个来自 linq 查询的列表(该 linq 查询的结果是字符串和 DBNull 的极少数情况)转换为列表(使用 ToList() 方法),所以我可以将 'dr' 转换为字符串,但我的问题来自 DBNull 值

4

2 回答 2

0

如果drDataRow无论如何都行不通的。您正在转换DataRow应该String会给您一个运行时错误。什么是ercDt(这是一个DataTable你甚至会得到一个编译器错误)?反正我会试一试的。

所以假设这ercDt是一个DataTable,我猜你想要所有的字段都有一个值,所以那些不是 DBNull.Value。使用DataRow.IsNull

DataColumn dc = ercDt.Columns[0]; // i don't know which column you use
var fields = from dr in ercDt.AsEnumerable()
             where !dr.IsNull(dc.Ordinal)
             select dc.Ordinal + "|" + dr[dc].ToString();
result.AddRange(fields);
于 2015-02-18T15:04:45.307 回答
0

我会这样做:

result.AddRange(from string dr in ercDt
select ((dc.Ordinal == null) ? string.Empty() : dc.Ordinal.ToString()) + 
    "|" + ((dr == null) ? string.Empty() : dr));
于 2015-02-18T15:10:55.103 回答