Linq合并两个查询时字符串赋值抛出空引用异常
解决Union合并查询时的空引用异常问题
嘿,我来帮你搞定这个问题~你遇到的空引用异常,核心原因其实很直白:你给第二个查询赋值了null的Department对象,当你后续试图读取它的Name属性时,就相当于从一个不存在的对象里拿东西,自然会抛出异常啦。
下面给你两个实用的解决方案,按需选择:
方案1:直接返回部门名称字段(推荐)
既然最终是要在表格里展示,不如直接把部门名称作为结果集的字段,不用返回整个Department对象。这样第二个查询里直接返回null或者空字符串,既能满足Union对属性一致性的要求,又能避免空对象的问题。
举个LINQ的例子:
// 第一个查询:包含Department的组织,取部门名称 var queryWithDept = from org in Organizations where org.Department != null select new { OrganizationName = org.Name, DepartmentName = org.Department.Name }; // 第二个查询:不含Department的组织,部门名称设为null var queryWithoutDept = from org in Organizations where org.Department == null select new { OrganizationName = org.Name, DepartmentName = (string)null }; // 合并两个查询 var combinedResult = queryWithDept.Union(queryWithoutDept);
后续表格渲染时,DepartmentName为null就直接显示空值,完全不会触发异常。
方案2:创建空的Department实例(需保留对象时用)
如果业务上必须返回完整的Department对象,那你不能赋值null,而是要创建一个实例化的空Department对象,把它的Name属性设为空字符串或者null:
// 定义一个空的Department实例 var emptyDepartment = new Department { Name = "" }; // 第一个查询:正常取存在的Department var queryWithDept = from org in Organizations where org.Department != null select new { OrganizationName = org.Name, Department = org.Department }; // 第二个查询:用空实例替代null var queryWithoutDept = from org in Organizations where org.Department == null select new { OrganizationName = org.Name, Department = emptyDepartment }; var combinedResult = queryWithDept.Union(queryWithoutDept);
这样访问Department.Name时,对象本身是存在的,只是属性值为空,就不会出现空引用异常了。
额外提醒
- 确保两个查询返回的结果集属性名称、类型完全一致,Union才能正常工作;
- 如果不需要去重,可以用
UnionAll代替Union,性能会更好一些。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

