2010-05-04 66 views
5

这里的问题拉姆达妥善处理可能System.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) 

我原来的查询是一个嵌套的循环,在那里我将作出多次往返到数据库,我不想重复。我查看了这里的一些类似问题,但是the solution didn't seem to fit

任何想法?

回答

3

为什么不只是检查null?

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; 
    }); 
+0

作品像一个冠军,非常感谢 – taco 2010-05-05 18:27:31