Linq报错“Nullable object must have a value” 字段为null时如何返回全部数据
解决方案
问题根源
你遇到的报错由两个核心问题导致:
- 当前使用多
from+where的关联写法本质是内连接(INNER JOIN),只要CargoActivities表中的ActivityTypeId、CargoCategoryId、TradeRouteId三个外键字段任意一个为null,或者没有匹配到关联表的记录,主表数据就会被直接过滤,且Nullable类型的外键在无值状态下直接参与等值判断时,会触发“Nullable object must have a value”异常。 - 当关联表无匹配记录时,直接访问
cargo.Name这类关联实体属性时,会尝试访问null对象的成员,也会触发同类异常。
调整后的代码
var cargoActivityResponse = await ( from ca in context.CargoActivities.Where(cargo => cargo.ReservationId == task[i].BerReservationId) // 关联逻辑改为左连接,保留外键为null的主表记录 join cargo in context.CargoActivityTypes on ca.ActivityTypeId equals cargo.Id into cargoJoin from cargo in cargoJoin.DefaultIfEmpty() join category in context.CargoCategories on ca.CargoCategoryId equals category.Id into categoryJoin from category in categoryJoin.DefaultIfEmpty() join routes in context.TradeRoutes on ca.TradeRouteId equals routes.Id into routeJoin from routes in routeJoin.DefaultIfEmpty() select new { // 用null条件运算符避免空对象访问异常,无匹配时对应字段值为null ActivityType = cargo?.Name, Cargo = category?.Name, TradeRoute = routes?.Name, Quantity_Num = ca.Quantity_Num, Quantity_UOM = ca.Quantity_UOM, } ).ToListAsync();
调整说明
- 所有关联逻辑从内连接改为左连接,
CargoActivities表中所有符合过滤条件的记录都会被保留,不会因为外键为null被过滤。 - 关联实体属性访问使用
?.null条件运算符,当关联实体无匹配时,对应返回的字段值为null,完全符合不忽略null列的业务要求,同时避免了空对象访问异常。 - 如果你使用的是低于EF Core 3.0的旧版本EF框架,null条件运算符可能无法正常转换为SQL,可以替换为三元表达式写法:
ActivityType = cargo == null ? null : cargo.Name,效果完全一致。
内容的提问来源于stack exchange,提问作者techstack
相关产品推荐
相关产品推荐

