使用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
相关产品推荐
相关产品推荐

