当没有记录返回时,EF Linq产品总和

use*_*713 8 c# linq entity-framework

我已经看到了这个问题的各种变化,但没有一个答案对我有用.他们中的大多数只是试图总结一个列 - 没有更复杂的,如下面的产品总和:

public double Total

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

如果没有返回任何行,我想返回零.但是,如果没有返回任何行,则.Sum()将失败.尝试插入Convert.ToDouble和使用null coalesce运算符有各种选项,但它们仍然给了我错误.

我确定我错过了一个简单的方法来做这个 - 任何帮助非常感谢经过长时间撞击谷歌砖墙!

Ser*_*kiy 13

删除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; 
   }
}
Run Code Online (Sandbox Code Playgroud)

生成的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
Run Code Online (Sandbox Code Playgroud)

  • @alexw刚验证 - 如果预期结果不可为空,则"Sum"抛出异常.因此,应该在`Sum`运算符中进行转换,以强制使用表达式`Sum <Expression <Func <Sale,double?>>`具有可空结果. (2认同)