protected virtual ShapedQueryExpression TranslateResultSelectorForJoin(
            [NotNull] ShapedQueryExpression outer,
            [NotNull] LambdaExpression resultSelector,
            [NotNull] Expression innerShaper,
            [CanBeNull] Type transparentIdentifierType)
        {
            Check.NotNull(outer, nameof(outer));
            Check.NotNull(resultSelector, nameof(resultSelector));
            Check.NotNull(innerShaper, nameof(innerShaper));

            outer = outer.UpdateShaperExpression(
                CombineShapers(outer.QueryExpression, outer.ShaperExpression, innerShaper, transparentIdentifierType));

            var transparentIdentifierParameter = Expression.Parameter(transparentIdentifierType);

            Expression original1         = resultSelector.Parameters[0];
            var        replacement1      = AccessOuterTransparentField(transparentIdentifierType, transparentIdentifierParameter);
            Expression original2         = resultSelector.Parameters[1];
            var        replacement2      = AccessInnerTransparentField(transparentIdentifierType, transparentIdentifierParameter);
            var        newResultSelector = Expression.Lambda(
                new ReplacingExpressionVisitor(
                    new Dictionary <Expression, Expression> {
                { original1, replacement1 }, { original2, replacement2 }
            })
                .Visit(resultSelector.Body),
                transparentIdentifierParameter);

            return(TranslateSelect(outer, newResultSelector));
        }