2012-11-25 74 views
8

我已經看到這個問題的變化遍佈整個地方,但沒有答案爲我工作。他們中的大多數只是試圖總結單列太多 - 沒有什麼更復雜的,如下面一個產品的總和:EF Linq產品總和,當沒有記錄返回

public double Total 

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

如果沒有行返回我要回零。但是,如果沒有行被返回,.Sum()失敗。試圖插入Convert.ToDouble和使用空的合併操作符有多種選擇,但它們仍然給我錯誤。

我敢肯定我錯過了一個簡單的方法來做到這一點 - 任何幫助之後,長時間撞在谷歌磚牆上的巨大讚賞!

回答

13

刪除DefaultIfEmpty()運營商。將Sum結果轉換爲可爲空類型。然後使用空合併運算符返回默認值,如果查詢返回null

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

生成的SQL的樣子:

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

感謝@lazyberezovsky。試過了 - 收到編譯器錯誤:操作符'??'不能應用於'double'和'int'類型的操作數。但這正是我想要達到的目標... – user1622713

+0

@ user1622713我認爲鑄造爲可空類型將幫助你 –

+0

@lazyberezovsky不'null'如果序列爲空則不返回零而不是'null'? –