internal NonEntityQueryModelVisitor(EntityQueryVisitor queryVisitor, IExpression mainFromComponent = null)
 {
     _visitor = queryVisitor;
     _from = null;
     _mainFromComponent = mainFromComponent;
     _bodies = new List<QueryComponent>();
 }
 private void VisitContainsResultOperator(ContainsResultOperator containsResultOperator, Remotion.Linq.QueryModel queryModel, int index)
 {
     Call call = new Call(MethodNames.In);
     call.Arguments.Add(Identifier.Current);
     _result = call;
 }
 private void VisitCountResultOperator(CountResultOperator countResultOperator, Remotion.Linq.QueryModel queryModel, int index)
 {
     _result = new Call(MethodNames.Count);
 }
 /// <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)
 {
     _visitor.VisitExpression(fromClause.FromExpression);
     _from = _visitor.RetrieveComponent();
     base.VisitAdditionalFromClause(fromClause, queryModel, index);
 }
        private void VisitAnyResultOperator(AnyResultOperator anyResultOperator, Remotion.Linq.QueryModel queryModel, int index)
        {
            string targetIdentifierString = _visitor.Query.CreateIdentifier(_visitor.ItemNameOverride);
            IList<EntityConstrain> entityConstrains = null;
            StrongEntityAccessor entityAccessor = (from accessor in _visitor.Query.GetQueryComponentNavigator().FindAllComponents<StrongEntityAccessor>()
                                                   let constrains = accessor.Elements.OfType<EntityConstrain>()
                                                   from constrain in constrains
                                                   let predicate = constrain.Predicate as Literal
                                                   where predicate != null
                                                   let predicateUri = (Uri)predicate.Value
                                                   let identifier = constrain.Value as Identifier
                                                   where identifier != null
                                                   let identifierString = _visitor.Query.RetrieveIdentifier(identifier.Name)
                                                   where identifierString == targetIdentifierString
                                                   where (entityConstrains = constrains.Where(item =>
                                                       (item.Predicate is Literal) && (((Uri)((Literal)item.Predicate).Value).AbsoluteUri == predicateUri.AbsoluteUri)).ToList()).Count > 0
                                                   select accessor).FirstOrDefault();
            if (entityAccessor != null)
            {
                foreach (EntityConstrain entityConstrain in entityConstrains)
                {
                    int indexOf = entityAccessor.Elements.IndexOf(entityConstrain);
                    entityAccessor.Elements.RemoveAt(indexOf);
                    OptionalPattern optional = new OptionalPattern();
                    optional.Patterns.Add(entityConstrain);
                    entityAccessor.Elements.Insert(indexOf, optional);
                }
            }

            Call call = new Call(MethodNames.Bound);
            _result = call;
        }
 /// <summary>Visits a main from clause.</summary>
 /// <param name="fromClause">Main from clause to be visited.</param>
 /// <param name="queryModel">Query model containing given from clause.</param>
 public override void VisitMainFromClause(MainFromClause fromClause, Remotion.Linq.QueryModel queryModel)
 {
     _visitor.VisitExpression(fromClause.FromExpression);
     _from = _visitor.RetrieveComponent();
     base.VisitMainFromClause(fromClause, queryModel);
 }
 internal EntityQueryModelVisitor(Query query, IEntityContext context)
 {
     _entityContext = context;
     _visitor = new EntityQueryVisitor(_query = (Query)(_result = query), _entityContext);
     _subject = null;
 }
        private void OverrideSelector(QueryComponent component, System.Linq.Expressions.Expression selector)
        {
            if ((component is Identifier) && (selector is System.Linq.Expressions.MemberExpression))
            {
                System.Linq.Expressions.MemberExpression memberExpression = (System.Linq.Expressions.MemberExpression)selector;
                if (!(memberExpression.Member is PropertyInfo))
                {
                    throw new NotSupportedException(System.String.Format("Selection on members of type '{0}' are not supported.", memberExpression.Member.MemberType));
                }

                PropertyInfo propertyInfo = (PropertyInfo)memberExpression.Member;
                if (typeof(IEntity).IsAssignableFrom(propertyInfo.DeclaringType))
                {
                    _propertyMapping = _entityContext.Mappings.FindPropertyMapping((PropertyInfo)memberExpression.Member);
                    if (typeof(IEntity).IsAssignableFrom(_propertyMapping.ReturnType))
                    {
                        OverrideEntitySelector((Identifier)component);
                    }
                    else
                    {
                        OverrideLiteralSelector(this.GetEntityAccessor((FromClauseBase)FindQuerySource(memberExpression).ReferencedQuerySource));
                    }
                }
            }
            else if (component is StrongEntityAccessor)
            {
                _propertyMapping = IdentifierPropertyMapping.Default;
                OverrideIdentifierSelector((StrongEntityAccessor)component);
            }
        }
        private void VisitContainsResultOperator(ContainsResultOperator containsResultOperator, Remotion.Linq.QueryModel queryModel, int index)
        {
            if (_query.IsSubQuery)
            {
                _visitor.VisitExpression(containsResultOperator.Item);
                QueryComponent item = _visitor.RetrieveComponent();
                if (item is IExpression)
                {
                    Filter filter = new Filter(new BinaryOperator(MethodNames.Equal, _mainFromComponent.About, (IExpression)item));
                    if (!_mainFromComponent.Elements.Contains(filter))
                    {
                        _mainFromComponent.Elements.Add(filter);
                    }
                }

                EntityConstrain constrain = new EntityConstrain(
                    new Identifier(_mainFromComponent.About.Name + "_p"),
                    new Identifier(_mainFromComponent.About.Name + "_o"),
                    containsResultOperator.Item);
                if (!_mainFromComponent.Elements.Contains(constrain))
                {
                    _mainFromComponent.Elements.Add(constrain);
                }

                Call call = new Call(MethodNames.Any);
                call.Arguments.Add(_query);
                _result = call;
            }
            else
            {
                throw new NotSupportedException(System.String.Format("Cannot perform 'Contains' operation on top level query."));
            }
        }
 private void VisitAnyResultOperator(AnyResultOperator anyResultOperator, Remotion.Linq.QueryModel queryModel, int index)
 {
     if (_query.IsSubQuery)
     {
         Call call = new Call(MethodNames.Any);
         call.Arguments.Add(_query);
         _result = call;
     }
     else
     {
         _query.QueryForm = QueryForms.Ask;
     }
 }