2016-12-08 2 views
1

Как избежать исключений из null при использовании запросов Lambda? В приведенном ниже коде, когда InstallationDateType имеет значение null, я получаю исключение. Как я могу справиться с этим?Значение Null в лямбда WHERE Предложение

foreach (AvailableDate availableDate in installationDatesResponseRootObject.Response 
       .InstallationDatesResponse 
       .AvailableDates 
       .Where(a => 
        a.InstallationDateType.ToString().ToUpper() == Constants.InstallationDateTypeDish)) 
{ 
    //Do Something 
} 
+0

Вы можете проверить, если это имеет значение, прежде чем начать свой цикл – RandomStranger

+1

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

ответ

3

Попробуйте использовать Null-Условный оператор ?. введенного в C# 6.

В вашем примере это будет

a.InstallationDateType?.ToString().ToUpper().Equals(Constants.InstallationDateTypeDish) 
2

Выработать на мой комментарий, вот пример:

var items = installationDatesResponseRootObject.Response.InstallationDatesResponse.AvailableDates 
    .Where(a => a.InstallationDateType?.ToString().ToUpper() == Constants.InstallationDateTypeDish); 
if (items.Any()) 
    foreach (var item in items) 
    { 
      //Do something 
    } 

Обратите внимание, что это всего лишь пример. Есть более эффективные способы проверить, является ли IEnumerable пустым или нет.

+0

Это все равно приведет к 'NullReferenceException', потому что если' InstallDateType' имеет значение null, то '.ToString () 'будет терпеть неудачу. –

+1

@ScottBamforth, вы правы. Исправлен мой ответ с помощью slanto. – RandomStranger

1

Проблема в том, что вы призваны .ToString() на null ссылок, так что вам нужно сначала проверить это.

Существует несколько различных способов проверки. Если вы используете последний C#, вам, вероятно, лучше использовать Null-Conditional Operator ?., представленный на C# 6, как упоминается slanto.

Если вы используете более старую версию C#, вы можете просто сделать это в своем методе Where, как показано ниже.

foreach (AvailableDate availableDate in installationDatesResponseRootObject.Response.InstallationDatesResponse.AvailableDates.Where(a => a.InstallationDateType != null && a.InstallationDateType.ToString().ToUpper() == Constants.InstallationDateTypeDish)) 
{ 
    //Do Something 
} 

Надеюсь, что это поможет.

3

Проверьте, не установлены ли установки InstallDatesResponseRootObject, Response, InstallationDatesResponse, AvailableDates. Затем измените LINQ в этом:

installationDatesResponseRootObject.Response.InstallationDatesResponse.AvailableDates.Where(a => a.InstallationDateType!=null && a.InstallationDateType.ToString().ToUpper() == Constants.InstallationDateTypeDish)) 
Смежные вопросы