Exemple #1
0
            void CombineQueries(AstNode node)
            {
                for (AstNode child = node.FirstChild; child != null; child = child.NextSibling)
                {
                    CombineQueries(child);
                }
                QueryExpression query = node as QueryExpression;

                if (query != null)
                {
                    if (query.Clauses.First().GetType() != typeof(QueryFromClause))
                    {
                        return;
                    }

                    QueryFromClause fromClause = (QueryFromClause)query.Clauses.First();
                    QueryExpression innerQuery = fromClause.Expression as QueryExpression;
                    if (innerQuery != null)
                    {
                        if (TryRemoveTransparentIdentifier(query, fromClause, innerQuery))
                        {
                            RemoveTransparentIdentifierReferences(query);
                        }
                        else
                        {
                            QueryContinuationClause continuation = new QueryContinuationClause();
                            continuation.PrecedingQuery = Detach(innerQuery);
                            continuation.Identifier     = fromClause.Identifier;
                            fromClause.ReplaceWith(continuation);
                        }
                    }
                    else
                    {
                        Match m = castPattern.Match(fromClause.Expression);
                        if (m.Success)
                        {
                            fromClause.Type       = Detach(m.Get <AstType>("targetType").Single());
                            fromClause.Expression = Detach(m.Get <Expression>("inExpr").Single());
                        }
                    }
                }
            }
Exemple #2
0
        void CombineQueries(AstNode node, Dictionary <string, object> fromOrLetIdentifiers)
        {
            AstNode next;

            for (AstNode child = node.FirstChild; child != null; child = next)
            {
                // store reference to next child before transformation
                next = child.NextSibling;
                CombineQueries(child, fromOrLetIdentifiers);
            }
            QueryExpression query = node as QueryExpression;

            if (query != null)
            {
                QueryFromClause fromClause = (QueryFromClause)query.Clauses.First();
                QueryExpression innerQuery = fromClause.Expression as QueryExpression;
                if (innerQuery != null)
                {
                    if (TryRemoveTransparentIdentifier(query, fromClause, innerQuery, fromOrLetIdentifiers))
                    {
                        RemoveTransparentIdentifierReferences(query, fromOrLetIdentifiers);
                    }
                    else
                    {
                        QueryContinuationClause continuation = new QueryContinuationClause();
                        continuation.PrecedingQuery = innerQuery.Detach();
                        continuation.Identifier     = fromClause.Identifier;
                        continuation.CopyAnnotationsFrom(fromClause);
                        fromClause.ReplaceWith(continuation);
                    }
                }
                else
                {
                    Match m = castPattern.Match(fromClause.Expression);
                    if (m.Success)
                    {
                        fromClause.Type       = m.Get <AstType>("targetType").Single().Detach();
                        fromClause.Expression = m.Get <Expression>("inExpr").Single().Detach();
                    }
                }
            }
        }