2010-05-04 13 views
5

Aquí está la consulta en cuestiónmanejar correctamente posible System.NullReferenceException en lambda expresiones

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

estructura de tabla
ProjectDetails (1) a muchas ExpenditureDetails
ExpenditureDetails (1 a muchos) ExpenditureAmounts
ExpenditureAmounts (1 a 1) RegistrosCompensadosMedidas

ProjectedEac es un campo decimal en los Registros Mensuales Consentidos.

El problema que descubrí en una prueba de unidad (aunque sea un evento poco probable), que la siguiente línea podría ser nulo:

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

Mi búsqueda original fue un bucle anidado, en donde yo iba a hacer múltiples viajes a la base de datos, algo que no quiero repetir He consultado lo que parecían algunas preguntas similares aquí, pero the solution didn't seem to fit.

¿Alguna idea?

Respuesta

3

¿Por qué no solo verifica el nulo?

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

Funciona como un campeón, muchas gracias – taco