C# LINQ关联列表访问嵌套属性触发空引用错误如何解决
问题原因
你遇到的空引用错误由以下几个常见场景触发:
rigModels列表中存在 null 元素- 部分
RigModel实例的Rig属性为 null:你虽然在构造函数中做了初始化,但反序列化、ORM查询、手动赋值等场景都可能绕过构造函数逻辑,导致Rig被置空 - 额外注意:你代码中存在类型命名不统一的问题,会额外引发编译错误:
- 定义的钻机详情类名为
Rigdetails,但RigJobBsonModel中Rigs属性的类型为RigDetails(大小写不一致) - 结果赋值时写的
new Rig没有对应类定义,应该和你的实际类型对齐
- 定义的钻机详情类名为
修复方案
版本1:保留原有内连接逻辑(仅保留两边匹配成功的数据)
先过滤无效数据再做关联,从根源避免空引用:
private static List<RigJobBsonModel> updateJobWithRigDetails( List<JobModel> jobModels, List<RigModel> rigModels) { // 先过滤无效数据 var validJobs = jobModels.Where(j => !string.IsNullOrEmpty(j.Rig)).ToList(); var validRigs = rigModels .Where(r => r != null && r.Rig != null && !string.IsNullOrEmpty(r.Rig.Id)) .ToList(); var result = validJobs.Join(validRigs, j => j.Rig, r => r.Rig.Id, (j, r) => new RigJobBsonModel { Id = j.Id, Job_code = j.Job_code, Product_line = j.Product_line, Geomarket = j.Geomarket, Roc = j.Roc, Network = j.Network, Simple_help = j.Simple_help, Created = j.Created, Modified = j.Modified, Modified_by = j.Modified_by, // 注意这里的类型要和你定义的类名统一,示例为RigDetails Rigs = new RigDetails { Title = r.Rig.Title, Enabled = r.Rig.Enabled } }); return result.ToList(); }
版本2:左外连接逻辑(保留所有Job,无匹配Rig时Rigs为null)
如果业务需要保留没有匹配到钻机的作业数据,可以用左外连接实现,适配RigJobBsonModel中Rigs的可空定义:
private static List<RigJobBsonModel> updateJobWithRigDetails( List<JobModel> jobModels, List<RigModel> rigModels) { var validRigs = rigModels .Where(r => r != null && r.Rig != null && !string.IsNullOrEmpty(r.Rig.Id)) .ToList(); var result = jobModels.GroupJoin(validRigs, j => j.Rig, r => r.Rig.Id, (j, rGroup) => new { j, r = rGroup.FirstOrDefault() }) .Select(res => new RigJobBsonModel { Id = res.j.Id, Job_code = res.j.Job_code, Product_line = res.j.Product_line, Geomarket = res.j.Geomarket, Roc = res.j.Roc, Network = res.j.Network, Simple_help = res.j.Simple_help, Created = res.j.Created, Modified = res.j.Modified, Modified_by = res.j.Modified_by, Rigs = res.r == null ? null : new RigDetails { Title = res.r.Rig.Title, Enabled = res.r.Rig.Enabled } }); return result.ToList(); }
内容的提问来源于stack exchange,提问作者IT Stretegist
相关产品推荐
相关产品推荐

