我有这个查询表达式,用于连接数据验证的一些值
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情况)转换为List(使用ToList()方法),所以我可以将'dr'转换为字符串,但我的问题来自DBNull值
答案 0 :(得分:0)
如果dr
是DataRow
无论如何都无效。您正在将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);
答案 1 :(得分:0)
我会这样做:
result.AddRange(from string dr in ercDt
select ((dc.Ordinal == null) ? string.Empty() : dc.Ordinal.ToString()) +
"|" + ((dr == null) ? string.Empty() : dr));