Esempio n. 1
0
        /// <summary>Visits a sub-query expression.</summary>
        /// <param name="expression">Expression to be visited.</param>
        /// <returns>Expression visited</returns>
        protected override System.Linq.Expressions.Expression VisitSubQuery(SubQueryExpression expression)
        {
            Remotion.Linq.Clauses.FromClauseBase sourceExpression = (Remotion.Linq.Clauses.FromClauseBase)((QuerySourceReferenceExpression)expression.QueryModel.SelectClause.Selector).ReferencedQuerySource;
            StrongEntityAccessor entityAccessor = (sourceExpression.FromExpression is System.Linq.Expressions.ConstantExpression ? null : this.GetEntityAccessor(sourceExpression));

            if (entityAccessor != null)
            {
                Query query = _query.CreateSubQuery(entityAccessor.About);
                query.AddEntityAccessor(entityAccessor);
                EntityQueryModelVisitor queryModelVisitor = new EntityQueryModelVisitor(query, _entityContext);
                queryModelVisitor.VisitQueryModel(expression.QueryModel);
                _lastComponent = queryModelVisitor.Result;
                HandleComponent(_lastComponent);
            }
            else
            {
                NonEntityQueryModelVisitor       queryModelVisitor = new NonEntityQueryModelVisitor(this, ConstantFromClause);
                Stack <IQueryComponentNavigator> currentComponent  = _currentComponent;
                _currentComponent = new Stack <IQueryComponentNavigator>();
                queryModelVisitor.VisitQueryModel(expression.QueryModel);
                _currentComponent = currentComponent;
                _lastComponent    = queryModelVisitor.Result;
                HandleComponent(_lastComponent);
            }

            return(expression);
        }
        /// <summary>Visits an additional from clause.</summary>
        /// <param name="fromClause">From clause to be visited.</param>
        /// <param name="queryModel">Query model containing given from clause.</param>
        /// <param name="index">Index of the where clause in the query model.</param>
        public override void VisitAdditionalFromClause(AdditionalFromClause fromClause, QueryModel queryModel, int index)
        {
            VisitQuerableFromClause(fromClause, queryModel, index);
            StrongEntityAccessor entityAccessor = (fromClause.FromExpression is System.Linq.Expressions.ConstantExpression ? null : _visitor.GetEntityAccessor(fromClause));

            if (entityAccessor != null)
            {
                _query.AddEntityAccessor(entityAccessor);
            }
            else
            {
                NonEntityQueryModelVisitor modelVisitor = new NonEntityQueryModelVisitor(_visitor);
                modelVisitor.VisitAdditionalFromClause(fromClause, queryModel, index);
                if (modelVisitor.From is Identifier)
                {
                    _subject = (Identifier)modelVisitor.From;
                }
                else if (modelVisitor.From is IExpression)
                {
                    _auxFromComponent = (IExpression)modelVisitor.From;
                }
            }

            base.VisitAdditionalFromClause(fromClause, queryModel, index);
        }
        /// <summary>Visits an additional from clause.</summary>
        /// <param name="fromClause">From clause to be visited.</param>
        /// <param name="queryModel">Query model containing given from clause.</param>
        /// <param name="index">Index of the where clause in the query model.</param>
        public override void VisitAdditionalFromClause(AdditionalFromClause fromClause, QueryModel queryModel, int index)
        {
            VisitQuerableFromClause(fromClause, queryModel, index);
            StrongEntityAccessor entityAccessor = (fromClause.FromExpression is System.Linq.Expressions.ConstantExpression ? null : _visitor.GetEntityAccessor(fromClause));
            if (entityAccessor != null)
            {
                if ((entityAccessor.OwnerQuery == null) && (!_query.Elements.Contains(entityAccessor)))
                {
                    _query.Elements.Add(entityAccessor);
                }
            }
            else
            {
                NonEntityQueryModelVisitor modelVisitor = new NonEntityQueryModelVisitor(_visitor);
                modelVisitor.VisitAdditionalFromClause(fromClause, queryModel, index);
                if (modelVisitor.From is Identifier)
                {
                    _subject = (Identifier)modelVisitor.From;
                }
                else if (modelVisitor.From is IExpression)
                {
                    _auxFromComponent = (IExpression)modelVisitor.From;
                }
            }

            base.VisitAdditionalFromClause(fromClause, queryModel, index);
        }