Tom
Tom

Reputation: 33

Issue with query returning null before I can check for null

For an invite function, I have a screen with a single field on it that lets users enter a code they've been given elsewhere. I then check in the controller to see which record is associated to this code. But my issue is with the controller blowing up if the code is not the first type is checks for (type 1 or type 2). So here what I believe it should be like(this doesn't work), although I realize the sloppiness I'm just new to 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.

I've attempted other versions where I put the object check within the if statement but there didn't work either. Any ideas?

Upvotes: 3

Views: 49

Answers (3)

MaNi
MaNi

Reputation: 1

  1. Use db.Records.Where(u => u.Code1).FirstOrDefault();
  2. Check the comparison value (ex. u.code1) if it has this property from the model before binding to the query.

Upvotes: 0

JamesFaix
JamesFaix

Reputation: 8645

Use FirstOrDefault not First. First throws an exception if the collection is empty, FirstOrDefault returns default(T) if the collection is empty.

And actually, there are overloads of First and FirstOrDefault that take a condition parameter, so you don't need to call Where

ex:

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

This will return the first odd number in the collection, or 0 if there are none that meet the condition (or none at all.)

Upvotes: 4

Steve
Steve

Reputation: 216243

As explained by the MSDN docs on IEnumerable.First, this method throws an exception if there are no elements in the sequence

The First(IEnumerable) method throws an exception if source contains no elements. To instead return a default value when the source sequence is empty, use the FirstOrDefault method

So you should write

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

Notice that the same condition used in the Where extension could be used directly with FirstOrDefault

By the way, it is unclear what your expression is. The lambda expression (syntax is => ) should return a boolean value so, or your Code1 is a boolean variable or something is wrong in that line

Upvotes: 2

Related Questions