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; } }