9

我到处都看到过这个问题的变体,但没有一个答案对我有用。他们中的大多数也只是试图对单个列求和 - 没有比乘积之和更复杂的了,如下所示:

public double Total

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

如果没有返回行,我想返回零。但是,如果没有返回行,则 .Sum() 失败。有多种尝试插入 Convert.ToDouble 和使用空合并运算符的选项,但它们仍然给了我错误。

我敢肯定我错过了一种简单的方法来做到这一点——在长时间撞击谷歌砖墙后,任何帮助都非常感激!

4

1 回答 1

14

删除DefaultIfEmpty()运算符。将Sum结果转换为可为空的类型。如果查询返回,则使用 null-coalescing 运算符返回默认值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
于 2012-11-25T10:15:22.323 回答