Well, the Expression trees are different (which is what the compilers generate and what the linq handler has to deal with): the GroupJoin in C#:
.GroupJoin(value(SD.LLBLGen.Pro.LinqSupportClasses.DataSource2`1[AdventureWorks.Dal.Adapter.EntityClasses.StoreContactEntity]),
<>h__TransparentIdentifier0 => <>h__TransparentIdentifier0.c.ContactId,
sc => sc.ContactId,
(<>h__TransparentIdentifier0, csc) =>
new <>f__AnonymousType1`2(<>h__TransparentIdentifier0 = <>h__TransparentIdentifier0, csc = csc))
and in VB.NET:
.GroupJoin(value(SD.LLBLGen.Pro.LinqSupportClasses.DataSource2`1[AdventureWorks.Dal.Adapter.EntityClasses.StoreContactEntity]),
$VB$It => $VB$It.c.ContactId,
sc => sc.ContactId,
($VB$It, $VB$ItAnonymous) => new VB$AnonymousType_4`2($VB$It = $VB$It, x = $VB$ItAnonymous))
See the difference between csc=csc and x=$VB$ItAnonymous ? (property generated on the anonymous type has a name different from the argument)
Looking into it (as there should be code to deal with this)