Linq to SQL查询中关联对象为空报错,如何提前做空值检查?
解决Linq to SQL中空引用异常的问题
当然可以搞定这个问题!你碰到的是Linq查询里超常见的空引用异常——当j.RegisteredInstructor为null时,直接访问它的Name、RegisteredTeacherId这些属性肯定会报错。下面给你两种实用的修复方案,你可以根据业务需求选:
方案1:过滤掉无讲师的活动
如果你的业务逻辑里不需要展示没有绑定讲师的活动,那可以直接在Where条件里加上空值判断,提前把这类数据排除掉:
viewModel.SpaceEvents = yogaSpace.YogaSpaceEvents .Where(j => j.EventDateTime >= DateTime.Now && j.RegisteredInstructor != null) .Select(j => new EventResult { RegsiteredInstructorName = j.RegisteredInstructor.Name, RegisteredInstructorId = j.RegisteredInstructor.RegisteredTeacherId, RegisteredTeacherImage = j.RegisteredInstructor.RegisteredTeacherImage }) .ToList();
方案2:保留无讲师的活动,给属性设默认值
如果要保留这些活动,只是想给空讲师的情况设置友好的默认值(比如显示“无讲师”、ID设为0或者null),可以用C#的**null条件运算符?.和空合并运算符??**来处理。Linq to SQL会把这些语法转换成对应的SQL判断,完全不会影响查询效率:
viewModel.SpaceEvents = yogaSpace.YogaSpaceEvents .Where(j => j.EventDateTime >= DateTime.Now) .Select(j => new EventResult { // 讲师为空时显示"无讲师",否则显示讲师名称 RegsiteredInstructorName = j.RegisteredInstructor?.Name ?? "无讲师", // 讲师为空时ID设为0(如果是可空类型可以直接用null) RegisteredInstructorId = j.RegisteredInstructor?.RegisteredTeacherId ?? 0, // 讲师为空时图片直接设为null RegisteredTeacherImage = j.RegisteredInstructor?.RegisteredTeacherImage }) .ToList();
简单说下这两个运算符的作用:
?.:先检查左边的对象是否为null,是null就直接返回null,不会继续访问后面的属性,从根源避免空引用。??:当左边的值为null时,用右边的默认值替代,适合给字符串、值类型设置友好的默认值。
这样修改后,不管RegisteredInstructor是否存在,查询都能正常执行,不会抛出异常啦~
内容的提问来源于stack exchange,提问作者chuckd
相关产品推荐
相关产品推荐

