2012-11-25 11 views
8

Ho visto variazioni di questa domanda ovunque ma nessuna delle risposte funziona per me. La maggior parte di loro sono solo cercando di sommare una singola colonna troppo - niente di più complesso come la somma di un prodotto, come di seguito:Somma prodotto EF Linq in assenza di record

public double Total 

    { 
     get 
     { 
      return _Context.Sales.Where(t => t.Quantity > 0) 
       .DefaultIfEmpty() 
       .Sum(t => t.Quantity * t.Price);     
     } 
    } 

Se non vengono restituite righe voglio tornare a zero. Tuttavia, se non viene restituita alcuna riga, il file .Sum() ha esito negativo. Esistono varie opzioni per tentare di inserire Convert.ToDouble e l'utilizzo di operatori di coalesce null, ma tutti mi hanno ancora dato errori.

Sono sicuro che mi manca un modo semplice per farlo - qualsiasi aiuto molto apprezzato dopo la battuta di testa troppo lunga contro google brick wall!

risposta

13

Rimuovi operatore DefaultIfEmpty(). Trasmetti il ​​valore Sum al tipo nullable. Quindi utilizzare operatore null-coalescenza per restituire valore predefinito se query ha restituito null

public double Total  
{ 
    get 
    { 
     return _Context.Sales 
         .Where(t => t.Quantity > 0) 
         .Sum(t => (double?)(t.Quantity * t.Price)) ?? 0; 
    } 
} 

generata SQL sarà simile:

SELECT SUM([Filter1].[A1]) FROM 
(SELECT CAST(CAST([Extent1].[Quantity] AS decimal(19,0)) * 
        [Extent1].[Price] AS float) AS [A1] 
FROM [dbo].[Sales] AS [Extent1] 
WHERE [Extent1].[Quantity] > 0) AS Filter1 
+0

Grazie @lazyberezovsky. Ho provato che - ricevi un errore del compilatore: Operatore '??' non può essere applicato agli operandi di tipo "double" e "int". Ma questo è esattamente quello che sto cercando di ottenere ... – user1622713

+0

@ user1622713 Penso che il casting in tipo nullable ti aiuterà –

+0

@lazyberezovsky non 'Sum' return zero not' null' se la sequenza è vuota? –