in general I'm following the suggestion of Resharper to replace Where(statement).FirstOrDefault() calls to FirstOrDefault(statement) since it's shorter and more elegant.
However the two statements are not identical all the times. For instance LinqToSharepoint does not interpret FirstOrDefault and if it is used directly on the source it means that
it retrieves all the contents of the source and then applies the condition in memory!
I know it's insane... Microsoft should be ashamed for such faulty implementation!
You can read more about it here: http://www.sharepointblues.com/2010/09/08/linq-to-sharepoint-performance-pitfalls/