2010-05-04 51 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