== does not call Equals , it searches for an overloaded == operator. Since anonymous types do not have an overloaded == operator, therefore C # uses a reference comparison for it.
But with Equals it compares field values. This is why the result between == and Equals is different.
Anonymous Types (C # Programming Guide)
Because the Equals and GetHashCode methods for anonymous types are defined in terms of the Equals and GetHashCode methods of a property, two instances of the same anonymous type are equal if all their properties are equal.
Habib source share