运行以下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以应对这种情况
答案 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;