2012-04-07 46 views
2

我有以下的(簡化)數據庫表:Linq到與左連接和sum()SQL拋出異常

Products 
- ProductID, int, PK 
- Name, varchar(50) 

Orders 
- OrderID, int, PK 
- ProductID, int, FK 
- Quantity, int, not null 

我想閱讀所有產品,如果可用的訂單,總結所有的量該產品的訂單。

的SQL查詢應該是這樣的:現在

select p.ProductID, p.Name, sum(o.Quantity) from Products p 
left join Orders o on p.ProductID = o.ProductID 
group by p.ProductID, p.Name 

,我想在LINQ到SQL查詢翻譯本。 我來這個至今:

var query = 
    from p in Products 
    join o in Orders on p.ProductID equals o.ProductID into po 
    from subOrder in po.DefaultIfEmpty() 
    group subOrder by new 
    { 
     p.ProductID, 
     p.Name, 
    } 
    into productGroup 
    select new 
    { 
     productGroup.Key.ProductID, 
     productGroup.Key.Name, 
     Quantity = productGroup.Sum(subOrder => subOrder.Quantity) 
    }; 

雖然生成的SQL看起來很好,我得到以下異常:

InvalidOperationException異常:null值不能分配與類型系統 成員.Int32是一個不可爲空的值類型。

有人可以告訴我查詢有什麼問題。任何幫助,將不勝感激!

回答

2

改爲使用productGroup.Sum(subOrder => (int?)subOrder.Quantity)

+0

對於降選民:http://connect.microsoft.com/VisualStudio/feedback/details/368947/linq-to-sql-sum-and-nullable-values。如果沒有任何'subOrder',則總和計算在一個空的結果集上並嘗試將null分配給int。 – Andreas 2012-04-07 09:55:46

+0

謝謝,這個作品!對於沒有訂單的所有產品,它都返回null。雖然生成的SQL並不完全如預期的那樣:'SELECT SUM([t2]。[value])AS [Quantity],[t2]。[ProductID],[t2]。[Name] FROM( SELECT [t1] [Quantity] AS [value],[t0]。[ProductID],[t0]。[Name] FROM [Products] AS [t0] LEFT OUTER JOIN [Orders] AS [t1] ON [t0]。[ ProductID] = [t1]。[ProductID] )AS [t2] GROUP BY [t2]。[ProductID],[t2]。[Name] ' – 2012-04-07 13:51:06

+0

@Andreas您可以使用lambda(基於方法)?沒有左連接方法,只有加入 – Willy 2014-06-20 07:59:45

2

使用它:

Quantity = productGroup.Sum(subOrder => (int?)subOrder.Quantity ?? 0) 
+0

謝謝,這個工程!它對沒有訂單的所有產品返回零。儘管生成的SQL並不完全如預期的那樣: FROM SELECTED COALES([t2]。[value])AS [Quantity],[t2]。[ProductID],[t2] ([t1]。[Quantity],@ p0)AS [value],[t0]。[ProductID],[t0]。[Name] FROM [Products] AS [t0] LEFT OUTER JOIN [Orders] AS [ [ProductID] = [t1]。[ProductID] )AS [t2] GROUP BY [t2]。[ProductID],[t2]。[Name] – 2012-04-07 13:47:59