That's a good point, didn't even think about that.
One thing that is interesting to note is that if you call SingleOrDefault() on an IQueryable, it does "SELECT TOP 2...." on the DB side and only returns two results from the entire collection back to .NET, which I assume behind the scenes, just checks if there are two results and then throws an exception.
So in this particular case, it doesn't need to iterate through the whole collection (although SQL server probably has to behind the scenes).