Правильно обрабатывающая возможная Система. NullReferenceException в лямбда-выражениях

Вот рассматриваемый запрос

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
ExpenditureDetails (1 многим) ExpenditureAmounts
ExpenditureAmounts (от 1 до 1) CommittedMonthlyRecords

ProjectedEac является десятичным полем на CommittedMonthlyRecords.

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

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

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

Какие-либо идеи?

5
задан Community 23 May 2017 в 12:26
поделиться

1 ответ

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

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;
    });
3
ответ дан 15 December 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: