如何验证linq上的空值

时间:2017-08-17 16:51:13

标签: c# json linq asp.net-mvc-5

对不起,如果我的英语不好。

我正在进行搜索,我正在使用JSon来进行查询,

当我使用下一个JSON从数据库获取数据时:

Json(db.CertificationHeaders.ToList().Join(db.CertificationDetails, c => 
c.HeaderCertificationID, cd => cd.HeaderCertificationID, (c, cd) => new { c, 
cd })
.Where((d => (d.c.PlanID.ToString().Contains(planID)) && 
d.cd.InternalConsecutive.Contains(internalConsecutive) || 
d.cd.SecurityConsecutive.Contains(securityConsecutive) || 
d.c.RequestDate.Value.Year.ToString().Contains(year) || 
d.c.DateGrant.Contains(grantDate)))

一切顺利,直到这部分代码:

d.cd.SecurityConsecutive.Contains(securityConsecutive)

当来自数据库的信息来自" null"我得到了

  

NullReferenceExeption

我一直在做研究,并且信息说当数据库中的值为null时会出现此错误,因此问题是:  我怎么能避免它?

2 个答案:

答案 0 :(得分:1)

您必须过滤掉null个实例。替换:

d.cd.SecurityConsecutive.Contains(securityConsecutive)

使用:

(d.cd.SecurityConsecutive != null && d.cd.SecurityConsecutive.Contains(securityConsecutive))

首先检查SecurityConsecutive是否仅为空是否会调用Contains。这要归功于&&运算符只检查第二个操作数,如果第一个操作数为真。将它全部包含在括号中会使外部Where将其视为单个语句。只有当两个内部表达式(!=Contains)都为真时才会成立。

答案 1 :(得分:0)

您需要添加更多防护代码。如果你有最新版本的.NET,它会变得容易一些:

Json(db.CertificationHeaders
    .ToList()
    .Join(db.CertificationDetails, c => c.HeaderCertificationID, 
         cd => cd.HeaderCertificationID, (c, cd) => new { c, cd })
    .Where((d => (d.c.PlanID?.ToString().Contains(planID)) && 
            d.cd.InternalConsecutive?.Contains(internalConsecutive) || 
            d.cd.SecurityConsecutive?.Contains(securityConsecutive) || 
            d.c.RequestDate?.Year.ToString().Contains(year) || 
            d.c.DateGrant?.Contains(grantDate)));

?语法称为null-conditional operator,您可以在此处了解详情:https://msdn.microsoft.com/en-us/magazine/dn802602.aspx

希望这有帮助!