2015-10-09 5 views
0

У меня есть DataTable, называемый dtMondayNewsLetter, и когда DT не возвращает строк. i.e. EmptyСсылка на объект не установлена ​​в экземпляр объекта в LINQ C#

это показывает ссылка объекта ошибка не указывает на экземпляр объекта

КОД

CurrentDirection = Convert.ToString((from DataRow dr in dtMondayNewsLetter.Rows 
        where (int)dr["PostID"] == PostID select (string)dr["Direction"]) 
          .FirstOrDefault()).Trim(); 

Какие изменения нужно сделать в коде выше, чтобы устранить ошибка.

+0

Вместо этого используйте 'for ... loop' намного проще. –

+7

Возможный дубликат [Что такое исключение NullReferenceException и как его исправить?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) –

ответ

0

Вы можете использовать Null-Coalescing Operator. в случае, если FirstOrDefault возвращает null возврат пустой строки.

CurrentDirection = 
    Convert.ToString(
     (from DataRow dr in dtMondayNewsLetter.Rows 
      where (int) dr["PostID"] == PostID 
      select (string) dr["Direction"]).FirstOrDefault() ?? "").Trim(); 
3

Как уже упоминалось, запрос

from DataRow dr in dtMondayNewsLetter.Rows 
where (int)dr["PostID"] == PostID 
select (string)dr["Direction"] 

возвращает ни одной строки, поэтому FirstOrDefault() возвращает null.

так что вы можете сделать просто if проверить Wheter результат доступен ..

var resultString = (from DataRow dr in dtMondayNewsLetter.Rows 
        where (int)dr["PostID"] == PostID 
        select (string)dr["Direction"]) 
        .FirstOrDefault(); 

if (resultString != null) 
{ 
    CurrentDirection = resultString.Trim(); 
} 
else 
{ 
    //case, when no rows 
} 
1

Чтобы расширить мой комментарий, я хотел бы сделать что-то вроде:

foreach (DataRow dr in dtMondayNewsLetter.Rows) 
{ 
    if (dr["PostID"] != DBNull.Value && dr["Direction"] != DBNull.Value) 
    { 
     if ((int)dr["PostID"] == PostID) 
     { 
      CurrentDirection = dr["Direction"].ToString(); 
     } 
    } 
} 

Стараясь быть кратким путем толкая все в заявлении LINQ не всегда является оптимальным. В вашем случае может быть несколько объектов или данных, которое равно NULL, что приводит к исключению исключения исключений для опорных исключений.

В одной строке оператора LINQ очень сложно определить, где находится объект NULL. Разделение этой инструкции LINQ на цикл for...each делает вещи намного проще и достигает такого же результата.

Однако, если «PostID» и «Direction» не являются нулевыми (при этом не нужно использовать проверки DBNull.Value), то используйте ответ @nopeflow, так как это намного безопаснее, чем ваша текущая реализация.

 Смежные вопросы

  • Нет связанных вопросов^_^