You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7查询数据库时触发Nullable Object must have a value异常求助

解决方案

问题出在左连接后,无匹配订单时数据库返回的NULL无法映射到匿名类型中的非可空值类型字段,EF Core在枚举结果时会抛出"Nullable object must have a value"异常。

修改方式1:将匿名类型的字段改为可空类型

把匿名类型里的非可空值类型(比如Guid、int)声明为可空版本,确保数据库返回NULL时能正常映射:

var query = from c in dbContext.Customers
            from o in dbContext.Orders
                .Select(o => new { Id = (Guid?)o.Id, Number = (int?)o.Number })
                .Where(o => o.CustomerId == c.Id)
                .DefaultIfEmpty()
            select new
            {
                Customer = c,
                Order = o 
            };

var result = await query.ToListAsync();

修改方式2:使用导航属性(更简洁)

如果Customer实体已配置Orders导航属性,直接用导航属性做左连接,再选择需要的字段,EF Core会自动处理可空映射:

var query = from c in dbContext.Customers
            from o in c.Orders.DefaultIfEmpty()
            select new
            {
                Customer = c,
                Order = o == null ? null : new { o.Id, o.Number }
            };

var result = await query.ToListAsync();

为什么之前的尝试无效?

  • 第一种尝试里的o != null判断无法被EF Core正确翻译为SQL,数据库层面不会执行这个逻辑,依然会返回NULL值;
  • 第二种尝试用Order实体而非匿名类型,当无订单时返回null,但如果Order实体的字段是非可空类型,EF依然会遇到NULL映射非可空的问题;
  • 第三种尝试在select阶段判空,但此时EF已经完成数据库查询到内存对象的映射,异常已经在枚举时抛出,这个判断无法提前拦截数据库层面的NULL映射问题。

内容的提问来源于stack exchange,提问作者Dan Van

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:23:11