7

When I run a linq query I get back the results only when an item can be found; if no items are found, it is throwing an exception "object reference not set to an instance of an object"

How do I not throw this exception? I want only to return a result even if it is empty.

var id = db.table.Where(a => a.item == passed_item).FirstOrDefault().id;
Demodave
  • 6,242
  • 6
  • 43
  • 58

4 Answers4

25

This method, FirstOrDefault, will return null, if an object not been found. Hence, if you try to read the value of id, then an exception will be thrown.

One way to avoid this is the following:

// I suppose that the id you want to read is an int.
// If it isn't, please change the code correspondingly. 
int id;

// Try to get the record.
var record = db.table.Where(a => a.item == passed_item)
                     .FirstOrDefault();

// If you find the record you are looking for, then read it's id.
if(record != null) 
{
    id = record.id;
}

Update

Another option it would be to follow that DavidG suggested in his comment:

var record = db.Table.FirstOrDefault(a => a.item == passed_item);

and the next step is the same.

Christos
  • 53,228
  • 8
  • 76
  • 108
4

You could use the Null-conditional operator instead:

int? id = db.table.Where(a => a.item == passed_item).FirstOrDefault()?.id;

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/member-access-operators#null-conditional-operators--and-

Bauer
  • 317
  • 3
  • 11
2
var id = (from a in db.table
      where a.item == passed_item
      select a.id).FirstOrDefault();

This will ensure that it only tries to dereference id when something is found. Other wise, id will be assigned whatever the default value for the id property is (null or zero)

James Curran
  • 101,701
  • 37
  • 181
  • 258
1

I saw the cause in null being one of the values.

SImageName = (Users.SImageName != null ? Users.SImageName : "User.png")

Check in your data there is no NULL value

                var userlist = (from Users in _context.TbUsersInfos
                            join Orgs in _context.TbBaseOrgs
                               on Users.NOrgCode equals Orgs.NCode
                            where
                               Users.NOrgCode == 1
                            orderby
                               Users.NUserCode
                            select new
                            {
                                NUserCode = Users.NUserCode.ToString(),
                                SImageName = (Users.SImageName != null ? Users.SImageName : "User.png"),
                            }).ToList();
Procrastinator
  • 2,526
  • 30
  • 27
  • 36
mjfakhr
  • 21
  • 3