2012-04-07 56 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