.Equals is reference equality.
== is value equality

Because they mean different things, you can't or rather shouldn't use == to call Equals() on the objects themselves, but on values of properties in the objects.

I see that in the ==, you're calling Equals, which then does a==b, which in turn will call Equals. That's why you're getting the stack overflow.