private void HandleJoinClause(QueryExpression node, JoinClauseExpression JoinExpr, int i) { var l1 = MakeLambda(_range, JoinExpr.Left); var l2 = MakeLambda(JoinExpr.Identifier, JoinExpr.Right); BlockExpression[] lambdas = { l1, l2, null }; if (i == node.Clauses.Count - 1 && node.Ending is SelectClauseExpression) { lambdas[2] = MakeLambda(_range, JoinExpr.Identifier, node.Ending.BaseExpr); var join = MakeMethodCall("Join", JoinExpr.Container, lambdas); Simplify(JoinExpr, join); node.Ending = null; } else { var constructor = MakeTupleConstructor(_range, JoinExpr.Identifier, TupleDepth(JoinExpr)); lambdas[2] = MakeLambda(_range, JoinExpr.Identifier, constructor); var join = MakeMethodCall("Join", JoinExpr.Container, lambdas); Simplify(JoinExpr, join); string name; InjectTransparentIdentifier(node, i, TupleDepth(JoinExpr), _range, JoinExpr.Identifier, out name); _range = new Declaration(name, null); FromClause(node).Identifier = _range; } }
override public void OnJoinClauseExpression(JoinClauseExpression node) { if (node.DeclaredType) { var typ = node.Identifier.Type; var gen = new GenericReferenceExpression(typ.LexicalInfo); gen.GenericArguments.Add(typ); gen.Target = new MemberReferenceExpression(node.Container, "Cast"); var inv = new MethodInvocationExpression(node.Container.LexicalInfo, gen); node.Container = inv; } base.OnJoinClauseExpression(node); }