我已经看到了这个问题的各种变化,但没有一个答案对我有用。他们中的大多数只是试图总结一个列 - 没有更复杂的,如下面的产品总和:
public double Total
{
get
{
return _Context.Sales.Where(t => t.Quantity > 0)
.DefaultIfEmpty()
.Sum(t => t.Quantity * t.Price);
}
}
如果没有返回任何行,我想返回零。但是,如果没有返回任何行,则.Sum()将失败。尝试插入Convert.ToDouble和使用null coalesce运算符有各种选项,但它们仍然给了我错误。
我确信我错过了一个简单的方法来做到这一点 - 经过长时间撞击谷歌砖墙后,任何帮助都非常感激!
答案 0 :(得分:13)
删除DefaultIfEmpty()
运算符。将Sum
结果转换为可空类型。如果查询返回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