【问题标题】:Linq To SQL with left join and sum() throws exception带有左连接和 sum() 的 Linq To SQL 抛出异常
【发布时间】:2012-04-07 20:38:59
【问题描述】:

我有以下(简化的)数据库表:

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-to-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:空值不能分配给 System.Int32 类型的成员,它是一个不可为空的值类型。

谁能告诉我查询有什么问题。任何帮助将不胜感激!

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

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

    【讨论】:

    • 对于反对者:connect.microsoft.com/VisualStudio/feedback/details/368947/…。如果没有任何subOrders,则根据空结果集计算总和并尝试将 null 分配给 int。
    • 谢谢,这行得通!它为所有没有订单的产品返回 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]
    • @Andreas 您可以使用 lambda(基于方法)翻译查询吗?没有 Left Join 方法,只有 Join
    【解决方案2】:

    使用它:

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

    【讨论】:

    • 谢谢,这行得通!对于所有没有订单的产品,它返回零。虽然生成的 SQL 并不完全符合预期:SELECT SUM([t2].[value]) AS [Quantity], [t2].[ProductID], [t2].[Name] FROM ( SELECT COALESCE([t1].[Quantity],@p0) 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]
    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2015-06-20
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多