5

这是有问题的查询

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 to Many) ExpenditureDetails
ExpenditureDetails (1 to Many) ExpenditureAmounts
ExpenditureAmounts (1 to 1) CommittedMonthlyRecords

ProjectedEac 是 CommittedMonthlyRecords 上的一个十进制字段。

我在单元测试中发现的问题(尽管不太可能发生),以下行可能为空:

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

我的原始查询是一个嵌套循环,在其中我将多次访问数据库,我不想重复。我在这里查看了一些类似的问题,但解决方案似乎不适合

有任何想法吗?

4

1 回答 1

3

为什么不只检查空值?

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;
    });
于 2010-05-04T22:42:06.397 回答