2010-05-04 2 views
5

가 여기에 해당 쿼리 ExpenditureDetails
ExpenditureDetails (많은 1) ExpenditureAmounts
ExpenditureAmounts제대로 처리 할 수 ​​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) (의 연산 식 1 - 1) CommittedMonthlyRecords

ProjectedEac은 CommittedMonthlyRecords의 십진수 필드입니다.

(AN 드문 경우이기는하지만) 내가 단위 테스트에서 발견 된 문제, 다음 줄은 널 (null)이 될 수 있다고 :

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

관련 문제