![](/img/trans.png)
[英]C# variable that should never be null throws null reference exception
[英]Should a reference to a null variable throw exception
下面的查询由多个INNER JOIN
子句组成。
Student
表中有很多外键,这些外键被查询中的名称替换。 我在下面使用LEFT OUTER JOIN
查询。 请注意, Students
MarkID
可以为null
。 这意味着marksGroup.DefaultifEmpty()
也可能返回null
。 因此,如果我只放置m
而不是m != null ? m.MarkName : "-- Not marked --"
m != null ? m.MarkName : "-- Not marked --"
在最后一行,当m
为null时,代码IMO应该引发异常,因为我引用的是此变量,但不是。 在构建此查询的示例上,编译器引发了异常。 请查看代码:
var result = from st in dbContext.Students where st.DepartmentID == 17
join d in dbContext.Departments on st.DepartmentID equals d.DepartmentID
join sv in dbContext.SoftwareVersions on st.SoftwareVersionID equals sv.SoftwareVersionID
join stat in dbContext.Statuses on st.StatusID equals stat.StatusID
join m in dbContext.Marks on st.MarkID equals m.MarkID into marksGroup
from m in marksGroup.DefaultIfEmpty()
select new
{
student = st.StudentName,
department = p.DepartmentName,
software = sv.SoftwareVersionName,
status = st.StatusName,
marked = m != null ? m.MarkName : "-- Not marked --"
};
我想念什么。 我仍然是C#和LINQ的初学者。
当您对SQL后端执行LINQ语句时(假设您在这里拥有Entity Framework), 整个语句将转换为SQL并由数据库引擎执行。
因此,.Net运行时将执行以下操作:
Expression
)转换为SQL 在您的情况下,可以通过零件安全地定义要创建的对象
select new
{
student = st.StudentName,
department = p.DepartmentName,
software = sv.SoftwareVersionName,
status = st.StatusName,
marked = m.MarkName
}
.Net运行时唯一关心的是创建一个匿名类型的实例,并从结果集中的一行中设置其属性。 在某些行中, marked
的值可能为null
,因此在该特定对象中marked
将设置为null
。 .Net运行时不在那里处理MarksGroup
对象。
当然,在LINQ中,对象将完全不同。 为防止空对象引用,绝对必须执行空检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.