2010-05-04 15 views
5

Ecco la query in questionegestisce correttamente possibile System.NullReferenceException in Espressioni lambda

return _projectDetail.ExpenditureDetails 
    .Where(detail => detail.ProgramFund == _programFund 
     && detail.Expenditure.User == _creditCardHolder) 
    .Sum(detail => detail.ExpenditureAmounts.FirstOrDefault(
     amount => amount.isCurrent && !amount.requiresAudit) 
    .CommittedMonthlyRecord.ProjectedEac); 

Struttura Tabella
ProjectDetails (1 a molti) ExpenditureDetails
ExpenditureDetails (1 a molti) ExpenditureAmounts
ExpenditureAmounts (1 a 1) CommittedMonthlyRecords

ProjectedEac è un campo decimale in CommittedMonthlyRecords.

Il problema che ho scoperto in una prova di unità (anche se un evento improbabile), che la seguente riga potrebbe essere nullo:

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

La mia domanda originale era un ciclo nidificato, in cui mi sarebbe fare più viaggi al database, qualcosa che non voglio ripetere. Ho esaminato quelle che sembravano alcune domande simili qui, ma the solution didn't seem to fit.

Qualche idea?

risposta

3

Perché non controllare il 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

Funziona come un campione, molte grazie – taco