Правильная обработка возможного исключения System.NullReferenceException в лямбда-выражениях - PullRequest
5 голосов
/ 05 мая 2010

Вот вопрос в вопросе

return _projectDetail.ExpenditureDetails
    .Where(detail => detail.ProgramFund == _programFund
         && detail.Expenditure.User == _creditCardHolder)
    .Sum(detail => detail.ExpenditureAmounts.FirstOrDefault(
        amount => amount.isCurrent && !amount.requiresAudit)
    .CommittedMonthlyRecord.ProjectedEac);

Структура таблицы
ProjectDetails (1 ко многим) ExpenditureDetails
Расходные детали (от 1 до многих) Расходные расходы
ExpenditureAmounts (от 1 до 1) CommittedMonthlyRecords

ProjectedEac - это десятичное поле в CommittedMonthlyRecords.

Проблема, которую я обнаружил в модульном тесте (хотя и маловероятное событие), заключается в том, что следующая строка может быть нулевой:

detail.ExpenditureAmounts.FirstOrDefault(
    amount => amount.isCurrent && !amount.requiresAudit)

Мой исходный запрос был вложенным циклом, в котором я совершал несколько поездок в базу данных, что я не хочу повторять. Я рассмотрел некоторые похожие вопросы здесь, но решение не подходило .

Есть идеи?

1 Ответ

3 голосов
/ 05 мая 2010

Почему бы просто не проверить нулевое значение?

return _projectDetail.ExpenditureDetails.Where(detail => 
        detail.ProgramFund == _programFund && 
        detail.Expenditure.User == _creditCardHolder
    ).Sum(detail => {
        var a = detail.ExpenditureAmounts.FirstOrDefault(
            amount => amount.isCurrent && !amount.requiresAudit
        );
        return a != null ? a.CommittedMonthlyRecord.ProjectedEac : 0.0m;
    });
...