Linq Outer join对象引用未设置为对象DefaultIfEmpty的实例

时间:2016-01-27 11:34:57

标签: c# asp.net-mvc linq

我正在尝试制作一份单位清单,如果执行审计日期,则需要对审计日期进行审计,如果空白则不进行审计。

我的Get方法中有以下内容:

.about-border {
    display: block;
    width: 80px;
    height: 3px;
    background: #f1cd8f;
    margin: 20px auto;
}

/* Optional CSS to center align the heading text*/
.about h1, .about h2 {
   text-align: center;
}

然而,当我运行它时,我得到了

  

对象引用未设置为对象的实例。

在auditReportList变量上。

看看调试,在三个循环之后确实看起来是null,我假设在那种情况下,DefaultIfEmpty会启动,以便a == null可以在select中使用但是它似乎没有工作

2 个答案:

答案 0 :(得分:1)

在某些情况下防止null(三元a == null ? ... : ...)而忘记其他情况则是错误的。你应该防范所有情况。此处,未在UnitIdStnCommIdWatchCommId上完成。

旁注:在我的团队中,我已经要求禁止linq sql之类的语法。在我看来,这是一个错误的好主意'。在.Net中编写类似编译查询的sql很有吸引力,但实际上我们发现它们比基于linq lambda的扩展(如Where(a => ...)Select(a => ...),...)更不易读和理解。

答案 1 :(得分:0)

您的问题在于行from a in ur.DefaultIfEmpty()。如果ur为空,则a的值为null StnAssureAuditReport,那么当查询尝试评估u.UnitId时,您会得到NullReferenceException }。

from a in ur.DefaultIfEmpty() select { u.UnitId }的使用仅在urIQueryable<StnAssureAuditReport>时有效 - 对SQL的翻译会自动为您处理null个案。但是当urIEnumerable<StnAssureAuditReport>时(就像你的情况一样),u.UnitId会被评估并引发空异常。

我专注于u.UnitId属性,但所有u.*次调用都是如此。