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

使用LINQ内连接两个数组时触发Object reference未实例化异常

解决LINQ内连接时的空引用异常问题

你遇到的Object reference not set to an instance of an object空引用异常,主要由几个明确的代码问题导致,咱们一步步拆解并修复:

核心问题分析

1. GetData方法的数组初始化错误

你在GetData里写了model[] m = new model[1000];,这只是创建了一个能容纳1000个model对象的数组容器,但每个数组元素默认都是null。如果数据库查询返回的记录不足1000条,数组后面的元素依然是null,当LINQ遍历sourceData或targetData时,访问null.Id就会直接触发空引用异常。

2. 连接字符串拼写错误

代码里new SqlConnection(connectionStrin...明显少写了最后一个字母g,正确的参数名应该是connectionString。这个拼写错误会导致SqlConnection无法正常创建,进一步让GetData方法无法读取有效数据,甚至返回全是null的数组。

3. 潜在的数据库字段空值风险

如果数据库里的Id或Value字段允许为null,直接读取赋值也可能在后续逻辑中引发空引用(不过这不是当前最紧急的问题)。

修复后的完整代码

public class model 
{ 
    public string Id { get; set; } 
    public string Value { get; set; } 
}

class Program 
{ 
    static void Main(string[] args) 
    { 
        var sourceData = GetData(SourceConnectionstring, "select Id,Value from source"); 
        var targetData = GetData(TargetConnectionstring, "select Id,Value from target"); 

        // 提前过滤null元素,避免LINQ遍历时空引用
        var data = (from s in sourceData.Where(x => x != null)
                    join t in targetData.Where(x => x != null) 
                    on s.Id equals t.Id 
                    where s.Value != t.Value 
                    select new 
                    { 
                        srcKey = s.Id, 
                        srcSnapshot = s.Value, 
                        tgtKey = t.Id, 
                        tgtSnapshot = t.Value 
                    }).ToArray(); 
    } 

    public static model[] GetData(string connectionString, string sqlQuery) 
    { 
        // 用List动态存储数据,彻底避免固定大小数组带来的null元素问题
        List<model> modelList = new List<model>(); 

        // 修复连接字符串的拼写错误
        using (var sqlConnection = new SqlConnection(connectionString)) 
        { 
            sqlConnection.Open(); 
            using (var sqlCommand = new SqlCommand(sqlQuery, sqlConnection)) 
            { 
                using (var reader = sqlCommand.ExecuteReader()) 
                { 
                    while (reader.Read()) 
                    { 
                        model m = new model(); 
                        // 处理数据库字段为null的情况,逻辑更严谨
                        m.Id = reader["Id"] != DBNull.Value ? reader["Id"].ToString() : null; 
                        m.Value = reader["Value"] != DBNull.Value ? reader["Value"].ToString() : null; 
                        modelList.Add(m); 
                    } 
                } 
            } 
        } 

        // 把List转成数组返回,确保数组内元素都是实例化后的model对象
        return modelList.ToArray(); 
    } 
}

关键修复点说明

  • 用List<model>替代固定大小数组:动态添加每个查询到的model实例,保证返回的数组里没有null元素。
  • 修正connectionString拼写错误:确保数据库连接能正常建立。
  • LINQ查询前过滤null元素:即使GetData因意外返回null元素,也能提前拦截,避免后续访问属性时触发异常。
  • 处理数据库字段空值:用DBNull.Value做判断,避免直接将数据库的null值赋值给属性,逻辑更严谨。

内容的提问来源于stack exchange,提问作者I Love Stackoverflow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:12:07