If you're on .NET 4 (and it doesn't sound like you are), I think you might be able to do something clever with Enumerable.Zip. Something like:
var r = x.Zip(y, comparer.Compare).FirstOrDefault(c => c != 0);
though I can't see right now how to efficiently deal with the case where the shorter one is the same as the longer one, as far as it goes.
Edit: If you're only comparing arrays (or otherwise don't care about measuring your collections twice), then I think you can simply add:
if (r == 0) {
r = int.Compare(x.Count(), y.Count());
}
You could even combine these as:
var r = x.Zip(y, comparer.Compare)
.Concat(new [] { int.Compare(x.Count(), y.Count()) })
.FirstOrDefault(c => c != 0)
(And if you're on .NET 3.5, then add a Zip extension method, because it's easy to write and seriously useful all over the place! I don't know why it wasn't included in the initial Linq release.)