protected virtual Expression VisitJoin(JoinExpression node) { Expression left = VisitSource(node.Left); Expression right = VisitSource(node.Right); Expression condition = Visit(node.Condition); if (node.Left != left || node.Right != right || node.Condition != condition) { return new JoinExpression(node.Type, left, right, condition); } return node; }
private Expression BindJoin(Type resultType, Expression outerSource, Expression innerSource, LambdaExpression outerKey, LambdaExpression innerKey, LambdaExpression resultSelector) { ProjectionExpression outerProjection = VisitSequence(outerSource); ProjectionExpression innerProjection = VisitSequence(innerSource); _map[outerKey.Parameters[0]] = outerProjection.Projector; Expression outerKeyExpr = Visit(outerKey.Body); _map[innerKey.Parameters[0]] = innerProjection.Projector; Expression innerKeyExpr = Visit(innerKey.Body); _map[resultSelector.Parameters[0]] = outerProjection.Projector; _map[resultSelector.Parameters[1]] = innerProjection.Projector; Expression resultExpr = Visit(resultSelector.Body); var join = new JoinExpression(resultType, outerProjection.Source, innerProjection.Source, Expression.Equal(outerKeyExpr, innerKeyExpr)); SourceAlias alias = GetNextAlias(); ProjectedColumns pc = ProjectColumns(resultExpr, alias, outerProjection.Source.Alias, innerProjection.Source.Alias); return new ProjectionExpression( new SelectExpression(alias, pc.Columns, join, null), pc.Projector ); }