Both Single and SingleOrDefault will enumerate the collection beyond the first matching result to ensure that there is exactly one item matching the criteria, stopping either at the next match or at the end of the collection. The first example will be a bit slower, since the Any call will enumerate enough of the collection (perhaps all of this) to determine whether any elements meet the criteria, stopping either at the first match or at the end of the collection.
There is another critical difference: the first example may throw an exception. Single will return the corresponding element if it is exactly one, and otherwise throw an exception. Validation with Any does not validate this; he only checks that there is at least one.
Based on these two reasons (primarily / especially the second reason), the SingleOrDefault approach is preferable here.
So there are three cases.
Case 1: no items match the condition
Option 1: .Any lists the entire set and returns false; .Single never executed.
Option 2: .SingleOrDefault lists the entire set and returns null.
The options are essentially equivalent.
Case 2: Exactly one element meets the condition
Option 1: Any lists enough set to search for a single match (may be the first element, may be the entire set). Single then lists the entire set to find one item and confirm that other conditions do not meet this condition.
Option 2: SingleOrDefault lists the entire set, returns a single match.
In this case, option 2 is better (exactly one iteration compared to (1, 2] iterations)
Case 3: more than one item meets the condition
Option 1: Any lists enough to find the first match. Single lists enough to find the second match, throws an exception.
Option 2: SingleOrDefault lists enough to find the second match, throws an exception.
Both throw exceptions, but option 2 gets faster.