Исключение DBNull в выражении запроса

У меня есть это выражение запроса, чтобы объединить некоторые значения для проверки данных

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


person culebrin    schedule 18.02.2015    source источник
comment
Если dr это DataRow, это все равно не работает. Вы переводите DataRow в String, что должно дать вам ошибку времени выполнения. Что такое ercDt (если бы это было DataTable, вы бы получили ошибку компилятора)? Что вы на самом деле пытаетесь сделать?   -  person Tim Schmelter    schedule 18.02.2015
comment
Спасибо, Тим, ercDt — это объект списка, но эти объекты я принял за строки (результат linq-запроса из таблицы данных и преобразован с помощью метода .ToList()), поэтому я привожу их как строку прямо из ercDt. То, что я пытаюсь сделать, это объединить содержимое ercDt с порядковым номером таблицы данных более высокого уровня (dc из другой таблицы данных)   -  person culebrin    schedule 18.02.2015


Ответы (2)


Если 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);
person Tim Schmelter    schedule 18.02.2015
comment
Спасибо, Тим, ercDt — это объект списка, но эти объекты я принял за строки (результат linq-запроса из таблицы данных и преобразован с помощью метода .ToList()), поэтому я привожу их как строку прямо из ercDt. То, что я пытаюсь сделать, это объединить содержимое ercDt с порядковым номером таблицы данных более высокого уровня (dc из другой таблицы данных) - person culebrin; 18.02.2015
comment
@culebrin: может быть, мой ответ все равно полезен. - person Tim Schmelter; 18.02.2015

я бы сделал так:

result.AddRange(from string dr in ercDt
select ((dc.Ordinal == null) ? string.Empty() : dc.Ordinal.ToString()) + 
    "|" + ((dr == null) ? string.Empty() : dr));
person Scottie    schedule 18.02.2015
comment
Спасибо, Скотти, ваш ответ дает мне представление об ограничении списка перед его запросом. Я дам Вам знать... - person culebrin; 18.02.2015