Пример #1
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();
                    }
                }
            }
        }
Пример #2
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)
            {
                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 = innerQuery.Detach();
                        continuation.Identifier     = fromClause.Identifier;
                        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();
                    }
                }
            }
        }