Exemplo n.º 1
0
        private void HandleFromClause(QueryExpression node, FromClauseExpression fromExpr, int i)
        {
            var             e2 = fromExpr.Container;
            BlockExpression l1 = MakeLambda(_range, e2);

            if (i == node.Clauses.Count - 1 && node.Ending is SelectClauseExpression)
            {
                var l2 = MakeLambda(_range, fromExpr.Identifier, node.Ending.BaseExpr);
                BlockExpression[] lambdas = { l1, l2 };
                var sm = MakeMethodCall("SelectMany", lambdas);
                Simplify(fromExpr, sm);
                node.Ending = null;
            }
            else
            {
                var constructor           = MakeTupleConstructor(_range, fromExpr.Identifier, TupleDepth(fromExpr));
                var l2                    = MakeLambda(_range, fromExpr.Identifier, constructor);
                BlockExpression[] lambdas = { l1, l2 };
                var sm                    = MakeMethodCall("SelectMany", lambdas);
                Simplify(fromExpr, sm);
                string name;
                InjectTransparentIdentifier(node, i, TupleDepth(fromExpr), _range, fromExpr.Identifier, out name);
                _range = new Declaration(name, null);
                FromClause(node).Identifier = _range;
            }
        }
Exemplo n.º 2
0
 override public void OnFromClauseExpression(FromClauseExpression 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.OnFromClauseExpression(node);
 }
Exemplo n.º 3
0
 override public void OnQueryExpression(QueryExpression node)
 {
     if (node.Cont != null)
     {
         QueryContinuationExpression cont = node.Cont;
         node.Cont = null;
         QueryExpression outer = cont.Body.CloneNode();
         outer.LexicalInfo = node.LexicalInfo;
         var newFrom = new FromClauseExpression(FromClause(node).LexicalInfo);
         newFrom.Container = node;
         outer.Clauses.Insert(0, newFrom);
         ReplaceCurrentNode(outer);
     }
     base.OnQueryExpression(node);
 }