2012-01-24 12 views
5

Ho la seguente espressione LINQ:LINQ non somma un gruppo con un float? struttura

pantry = (from p in items 
      group p by p.IngredientId into g 
      select new PantryItem() { IngredientId = g.Key, Amt = g.Sum(p => p.Amt) }); 

Fondamentalmente, sto cercando di rimuovere i duplicati da un array sommando loro importo totale. Quindi, se ho 2 elementi di IngredientId x, uno con Amt 5 e l'altra con Amt 10, voglio un singolo elemento di Ingrediente x con la Amt 15. Abbastanza facile vero?

Ora, per rompere completamente tutto, Amt è in realtà un float?, non uno float. Tuttavia, quando I Sum un gruppo con tutti gli importi null, ottengo 0.0 anziché null.

Ecco quello che voglio:

x - null 
x - null 
y - 5 
y - 10 
z - 10 
z - null 

devono essere convertite in:

x - null 
y - 15 
z - 10 

Ma invece io ottenere:

x - 0.0 
y - 15 
z - 10 

C'è un modo per ri-lavorare il mio query LINQ per facilitare questo? Spero che la mia domanda è abbastanza chiaro :)

+0

Bene è 'Amt' in' PantryItem' di tipo Nullable? Penso che non sia probabilmente – V4Vendetta

+0

'Amt' è un' float? ' –

risposta

3

Hai 2 scelte:

  1. Scrivi la tua implementazione di Sum
  2. Verificare se tutti i valori sono null, per poi tornare null, altrimenti restituisce somma, ad esempio:

pantry = (from p in items 
      group p by p.IngredientId into g 
      select new PantryItem() 
      { 
       IngredientId = g.Key, 
       Amt = g.Any(p => p.Amt.HasValue) ? g.Sum(p => p.Amt) : null 
      }); 

NO TE: 2 n. la query verrà enumerata due volte.

+0

C'è un modo per farlo in una istruzione LINQ, o dovrei costruire una matrice di gruppi nulli, quindi costruire una matrice di gruppi non nulli, quindi aggiungerli insieme? –

+0

Oh fico (ignora il commento, l'ho scritto prima di aggiornare la tua risposta) - Ci proverò! –

+0

Funziona alla grande, grazie mille! –