当没有任何要求时,Linq .Sum()函数失败

时间:2015-05-21 08:51:44

标签: c# linq

运行以下Linq查询时

ViewBag.AmountThisYear = db.Bookings
            .Where(p => p.Id == id && 
                        p.StartDate.Year == DateTime.Now.Year)
            .Sum(t => t.Price);

当where子句

中没有返回任何结果时,我收到以下错误
  

转换为值类型'System.Decimal'失败,因为   具体化值为null。结果类型的通用参数   或者查询必须使用可空类型。

如何编写Sum以应对这种情况

3 个答案:

答案 0 :(得分:13)

由于没有返回任何行,因此无法求和。您可以使用DefaultIfEmpty

ViewBag.AmountThisYear = db.Bookings
            .Where(p => p.Id == id && 
                        p.StartDate.Year == DateTime.Now.Year)
            .Select(t => t.Price)
            .DefaultIfEmpty(0)
            .Sum();

答案 1 :(得分:1)

如果要计算的字段不可为空,则需要首先强制为可为空的值进行计算。因此更改如下:

ViewBag.AmountThisYear = db.Bookings
            .Where(p => p.Id == id && 
                        p.StartDate.Year == DateTime.Now.Year)
            .Sum(t => (decimal?)t.Price) ?? 0m;

此外,添加合并运算符(??)将null转换为0。

答案 2 :(得分:0)

decimal sum = 0;
var booking = db.Bookings
        .Where(p => p.Id == id && 
                    p.StartDate.Year == DateTime.Now.Year);


if(bookings.Any())
{
    sum = booking.Sum(t => t.Price);
}

ViewBag.AmountThisYear = sum;