在我可以检查null之前,查询返回null的问题

时间:2016-06-30 21:31:57

标签: c# asp.net-mvc linq

对于邀请函数,我有一个屏幕,其上有一个字段,用户可以输入他们在别处获得的代码。然后我检查控制器以查看与此代码关联的记录。但我的问题是控制器爆炸如果代码不是第一种类型是检查(类型1或类型2)。所以我认为它应该是这样的(这不起作用),虽然我意识到我只是新来的c#。

Record rec = db.Records.Where(u = u.Code1).First();
If (rec != null) 
{
   Other code...
   Exit controller
}


Record rec2 = db.Records.Where(u = u.Code2).First();
If (rec2 != null) 
{
   Other code...
   Exit controller
}

Return to view - codes are invalid.

我尝试了其他版本,我将对象检查放在if语句中但是也没有用。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

使用FirstOrDefault而不是First。如果集合为空,则首先抛出异常,如果集合为空,则FirstOrDefault返回default(T)

实际上,FirstFirstOrDefault的重载带有条件参数,因此您不需要调用Where

例如:

var x = numbers.FirstOrDefault(n => n % 2 == 1);

这将返回集合中的第一个奇数,如果没有满足条件的话,则返回0(或者根本不返回。)

答案 1 :(得分:2)

正如MSDN docs on IEnumerable.First所解释的,如果序列中没有元素,此方法会抛出异常

  

First(IEnumerable)方法抛出异常if   source不包含任何元素。而是在返回时返回默认值   源序列为空,使用FirstOrDefault方法

所以你应该写

Record rec = db.Records.FirstOrDefault(u => u.Code1);
if(rec == null)
{
    ....
}

请注意,Where扩展中使用的相同条件可以直接与FirstOrDefault

一起使用

顺便说一下,目前还不清楚你的表达是什么。 lambda表达式(语法为=>)应该返回一个布尔值,或者你的Code1是一个布尔变量,或者该行中出错了什么

答案 2 :(得分:0)

  1. 使用db.Records.Where(u => u.Code1).FirstOrDefault();
  2. 检查比较值(例如u.code1)是否在绑定到查询之前从模型中具有此属性。