Tengo una colección de Linq de Things
, donde Thing
tiene una propiedad Amount
(decimal).¿Cómo hacer agregados Linq cuando puede haber un conjunto vacío?
estoy tratando de hacer un agregado en esto por un cierto subconjunto de las Cosas:
var total = myThings.Sum(t => t.Amount);
y que funciona muy bien. Pero luego he añadido una condición que me dejó sin cosas en el resultado:
var total = myThings.Where(t => t.OtherProperty == 123).Sum(t => t.Amount);
Y en vez de conseguir Total = 0 o nula, me sale un error:
System.InvalidOperationException: The null value cannot be assigned to a member with type System.Decimal which is a non-nullable value type.
Eso es realmente desagradable, porque no esperaba ese comportamiento. Hubiera esperado que el total fuera cero, tal vez nulo, ¡pero sin duda no arrojaría una excepción!
¿Qué estoy haciendo mal? ¿Cuál es la solución/solución?
EDITAR - ejemplo
Gracias a todos por sus comentarios. Aquí hay un código, copiado y pegado (no simplificado). Es LinqToSql (tal vez por eso no se podía reproducir mi problema):
var claims = Claim.Where(cl => cl.ID < 0);
var count = claims.Count(); // count=0
var sum = claims.Sum(cl => cl.ClaimedAmount); // throws exception
Guau, ¡eso * es * realmente desagradable! Si esa es la forma en que Linq se define con conjuntos de resultados vacíos, fue una elección triste por parte de los diseñadores del lenguaje, ya que requerirá CADA uso de un agregado para ser envuelto en una prueba para un conjunto vacío. – MtnViewMark
Ayudaría si mostrara los tipos explícitamente. Acabo de probar 'new decimal [] {1} .Where (i => i! = 1) .Sum()' en LINQPad y obtuve 0, como se esperaba. –
@ Craig Stuntz - esto puede deberse a que no está accediendo a una propiedad en su Suma() - es decir, no puede manejar ningún resultado con Suma(), pero no con Suma (t => t.Tallar) como t.La suma es ser llamado en "t", que es nulo. – Fenton