使用LINQ SUM时出现异常。

11

我正在尝试获取"bookings"的总和,但是出现了错误:"将实体化的值转换为值类型 'Int32' 失败,因为它为空。结果类型的泛型参数或查询必须使用可空类型。"

var bookings = entities.Bookings.Where(x => x.ID == id &&
                                     x.StartDate <= bookingEnd &&
                                     x.EndDate >= bookingStart)
                                    .Sum(x => x.BookingQuantity);

我该如何修复这个问题?如果它变成null,我需要得到0,否则就是bookings。


在这里同样有一个问题:https://dev59.com/i3I95IYBdhLWcg3w8y6N - VikciaR
3个回答

41

尝试使用空值合并运算符:

var bookings = entities.Bookings.Where(x => x.ID == id &&
                                 x.StartDate <= bookingEnd &&
                                 x.EndDate >= bookingStart && 
                                 x.BookingQuantity != null)
                                .Sum(x => (int?)x.BookingQuantity) ?? 0;

或者将bookings声明为可为空的int类型。

int? bookings = ...

编译器的类型推断将Sum方法的结果解析为普通的int类型,而这个类型永远不会是null。


在我的情况下,它也返回int,而不是可空int,这没有意义。那么,如何使用“?? 0”修复它呢? - Zapnologica

15

这个页面提供了解决此问题的方法;

Sum(x => (int?)x.BookingQuantity) ?? 0;

我的编译器报错,显示“?? 不能应用于 int 类型”。 - Zapnologica
你把它转换成(int?)了吗? - Chris McAtackney

1

添加空值检查。

var bookings = entities.Bookings.Where(x => x.ID == id &&
                                     x.StartDate <= bookingEnd &&
                                     x.EndDate >= bookingStart && 
                                     x.BookingQuantity != null)
                                    .Sum(x => x.BookingQuantity);

SELECT * FROM Bookings WHERE BookingQuantity IS NULL 返回0行,因此如果有任何行,则所有行都具有1个或更多个。 - Lasse Edsvik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接