Example #1
0
        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;
            }
        }
Example #2
0
 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);
 }