2012-11-25 11 views
8

Widziałem różne warianty tego pytania w każdym miejscu, ale żadna z odpowiedzi nie działa dla mnie. Większość z nich są po prostu staramy się podsumować pojedynczą kolumnę też - nic bardziej złożone, takie jak suma produktu, jak poniżej:EF Linq Suma produktu, gdy nie powróciły żadne dokumenty

public double Total 

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

Jeśli nie wiersze są zwracane chcę wrócić do zera. Jednak jeśli nie zostaną zwrócone żadne wiersze, funkcja .Sum() nie powiedzie się. Istnieją różne opcje próbowania wstawienia Convert.ToDouble i używania operatorów z zerowym koalescencją, ale wszystkie nadal dawały mi błędy.

Jestem pewien, że brakuje mi prostego sposobu, aby to zrobić - jakiejkolwiek pomocy cenionej po zbyt długim uderzeniu głową o ścianę google!

Odpowiedz

13

Usuń operator DefaultIfEmpty(). Oddaj wynik Sum do typu zerowalnego. Następnie użyj operatora null koalescencyjny wrócić wartość domyślną, jeśli zapytanie zwróciło null

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

Generated SQL będzie wyglądać następująco:

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

Thanks @lazyberezovsky. Próbowałem tego - otrzymuję błąd kompilatora: Operator "??" nie można zastosować do operandów typu "double" i "int". Ale to jest dokładnie to, co próbuję osiągnąć ... – user1622713

+0

@ user1622713 Myślę, że casting do typu nullable pomoże ci –

+0

@lazyberezovsky nie zwraca 'Suma' zero zero' null' jeśli sekwencja jest pusta? –

Powiązane problemy