Single(): There is exactly 1 result, an exception is thrown if no result is returned or more than one result.
SingleOrDefault(): Same as Single(), but it can handle the null value.
First(): There is at least one result, an exception is thrown if no result is returned.
FirstOrDefault(): Same as First(), but not thrown any exception or return null when there is no result.
When to use?
Use Single / SingleOrDefault() when you are sure there is only one record present in a database or you can say if you querying on a database with the help of the primary key of the table.
Developers may use First () / FirstOrDefault() anywhere when they require a single value from a collection or database.