Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework 4 Single() vs First() vs FirstOrDefault()

People also ask

What is the difference between first () and FirstOrDefault ()?

The major difference between First and FirstOrDefault is that First() will throw an exception if there is no result data for the supplied criteria whereas FirstOrDefault() returns a default value (null) if there is no result data.

What is difference between first FirstOrDefault single SingleOrDefault?

Single() asserts that one and only one element exists in the sequence. First() simply gives you the first one. Use Single / SingleOrDefault() when you sure there is only one record present in database or you can say if you querying on database with help of primary key of table.

Is FirstOrDefault faster than first?

First() and FirstOrDefault() are faster than Single() and SingleOrDefault() because First find the first() match only whereas Single() search element in a whole collection of elements.

Should I use FirstOrDefault first?

Use First() when you are sure that a query must return a record, and use FirstOrDefault() when you are not sure whether it will return a record or not.


Here is an overview of the different methods:

  • Find() - when you want to get an item by primary key. This will return null if it can't find an item. It will look in the context before going to the database (as pointed out by Yaron in the comments) which can be an important efficiency factor if you need to get the same entity multiple times while the same context is alive.

  • Single() - when you expect exactly one item to be returned by a query. This will throw an exception if the query does not return exactly one item.

  • SingleOrDefault() - when you expect zero or one items to be returned by a query (i.e. you are not sure if an item with a given key exists). This will throw an exception if the query does not return zero or one items.

  • First() - when you expect one or more items to be returned by a query but you only want to access the first item in your code (ordering could be important in the query here). This will throw an exception if the query does not return at least one item.

  • FirstOrDefault() - when you expect zero or more items to be returned by a query but you only want to access the first item in your code (i.e. you are not sure if an item with a given key exists)


I always tend to use FirstOrDefault. If you really want to be picky with performance then you should use FirstOrDefault in EF. Under the covers SingleOrDefault uses top (2) in the query because, it needs to check if there is a second row that matches the criteria and if it does, it throws an exception. Basically in SingleOrDefault you are saying that you want to throw an exception if your query returns more then 1 record.


It's really very simple: Single returns a single item and throw an exception if there is either none or more than one item. First will return the first item or throw when there is no item. FirstOrDefault will return the first item or return the default value (which is null in case the given type is a reference type) when there is no item.

This is the behavior the API is supposed to have. Note however that the underlying implementation could have a different behavior. While Entity Framework obeys this, a O/RM like LLBLGen can also return null when calling First which is a very strange thing. This was a very strange (and stubborn) decision by the designer IMO.


The four methods each have their place; Though you really only have two different operations.

  • First - Expecting a result set that contains multiple items, give me the first item in that set.
  • Single - Expecting a single result back, give me that item.

The xxxxOrDefault() version just adds on "I don't want to consider an empty result set to be an exceptional circumstance."


On the other side, you can divide these methods by the core logic, like this:

  • Method will query database directly: Single(), SingleOrDefault(), First(), FirstOrDefault()
  • Method will perform a search in cache before even issuing the query against the database: Find()

For some performance details, especially in the second case you can look here: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3

In addition, in the first group you can define complex queries, but with Find() method you can provide only entity key for search.