繁体   English   中英

是否应引用null变量引发异常

[英]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
  • 通过ADO.Net将SQL发送到数据库。
  • 接收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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM