Ошибка с объектом, возвращаемым при использовании предложения Linq Where - PullRequest
1 голос
/ 07 сентября 2011

У меня есть следующий код:

IList<CmsUserPermissionGroup> matchingRoles = PermissionGroups.Where(r => r.JournalCode.ToLower() == journalCode.ToLower())
                                                              .Where(r => r.CmsRole.ToLower() == role.ToLower())
                                                              .Where(r => r.AccessLevel > 0)

, который, как я предполагал, вернет пустой список, если результаты не будут возвращены.На самом деле возвращается следующая ошибка:

Ссылка на объект не установлена ​​на экземпляр объекта.

Описание: Произошло необработанное исключение во время выполнения текущего веб-запроса.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

Я что-то неправильно понимаю?Какая еще альтернатива?

Ответы [ 2 ]

3 голосов
/ 07 сентября 2011

Если бы не было проблем с запросом, было бы возвращено пустое перечисление.

Проблема здесь внутри ваших операторов Where().JournalCode или CmsRole равны нулю (при условии, что вы уже проверили journalCode и role для нулевых значений где-либо еще) на одном из объектов в PermissionGroups.Когда вы вызываете ToLower() для этого значения, оно выдает вышеупомянутое исключение.

Вы можете защитить себя немного лучше с помощью следующего:

if(!String.IsNullOrEmpty(journalCode) && !String.IsNullOrEmpty(role))
{
    Roles =
        PermissionGroups
            .Where(r => r.JournalCode != null
                        && r.JournalCode.Equals(journalCode,
                            StringComparison.InvariantCultureIgnoreCase))
            .Where(r => r.CmsRole != null
                        && r.CmsRole.Equals(role,
                            StringComparison.InvariantCultureIgnoreCase))
            .Where(r => r.AccessLevel > 0);
}
2 голосов
/ 07 сентября 2011

Это будет возвращать пустую последовательность, если результаты не возвращены и предикаты успешно .

Как это происходит, похоже, либо r было равно нулю для некоторого элемента, либо r.JournalCode было равно нулю для некоторого элемента, либо journalCode было равно нулю, либо r.CmsRole было равно нулю для некоторого элемента, либо role был нулевым LINQ не предотвращает всплытие этих исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...