Вот рассматриваемый запрос
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)
Мой исходный запрос был вложенным циклом, в том, где я буду совершать несколько поездок в базу данных, что-то, что я не хочу повторять. Я заглянул к тому, что походило на некоторые подобные вопросы здесь, но решение, казалось, не соответствовало.
Какие-либо идеи?
Почему бы просто не проверить нуль?
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;
});