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

C# LINQ关联列表访问嵌套属性触发空引用错误如何解决

问题原因

你遇到的空引用错误由以下几个常见场景触发:

  1. rigModels 列表中存在 null 元素
  2. 部分 RigModel 实例的 Rig 属性为 null:你虽然在构造函数中做了初始化,但反序列化、ORM查询、手动赋值等场景都可能绕过构造函数逻辑,导致Rig被置空
  3. 额外注意:你代码中存在类型命名不统一的问题,会额外引发编译错误:
    • 定义的钻机详情类名为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 14:24:05