private System.Linq.Expressions.Expression VisitPredicateMethodCallUnsafe(System.Linq.Expressions.MethodCallExpression expression, Uri predicate, StrongEntityAccessor entityAccessor) { _query.AddEntityAccessor(entityAccessor); Identifier memberIdentifier = new Identifier(_query.CreateVariableName(predicate.GetFragmentOrLastSegment())); EntityConstrain constrain = new EntityConstrain(); constrain.Predicate = new Literal(predicate); constrain.Value = memberIdentifier; if (!entityAccessor.Elements.Contains(constrain)) { entityAccessor.Elements.Add(constrain); } if (constrain.ShouldBeOptional(_currentComponent)) { entityAccessor.Elements.Remove(constrain); OptionalPattern optional = new OptionalPattern(); optional.Patterns.Add(constrain); entityAccessor.Elements.Add(optional); } HandleComponent(memberIdentifier); _lastComponent = memberIdentifier; return(expression); }
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) || ((_fromExpression != null) && (constrain.TargetExpression.EqualsTo(_fromExpression))) 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>Visit an optional patterns.</summary> /// <param name="optionalPattern">Optional patterns accessor to be visited.</param> protected override void VisitOptionalPattern(OptionalPattern optionalPattern) { _commandText.Append(Indentation); _commandText.AppendLine("OPTIONAL { "); Indentation += "\t"; foreach (EntityConstrain pattern in optionalPattern.Patterns) { VisitComponent(pattern); } Indentation = Indentation.Substring(0, Indentation.Length - 1); _commandText.Append(Indentation); _commandText.AppendLine("} "); }
/// <summary>Visits an entity member.</summary> /// <param name="expression">Expression to be visited.</param> /// <returns>Expression visited</returns> protected virtual System.Linq.Expressions.Expression VisitEntityProperty(EntityPropertyExpression expression) { StrongEntityAccessor entityAccessor = this.GetEntityAccessor(expression.Target); _query.AddEntityAccessor(entityAccessor); Identifier memberIdentifier = null; EntityConstrain constrain = _query.FindAllComponents <EntityConstrain>() .FirstOrDefault(item => (item.GetType() == typeof(EntityConstrain) && (item.TargetExpression.EqualsTo(expression.Expression)))); if (constrain == null) { memberIdentifier = (_query.FindAllComponents <StrongEntityAccessor>() .Where(item => item.SourceExpression.FromExpression.EqualsTo(expression.Expression)) .Select(item => item.About).FirstOrDefault()) ?? (new Identifier(_query.CreateVariableName(expression.Name), expression.EntityProperty.PropertyType)); constrain = new EntityConstrain(new Literal(expression.PropertyMapping.Uri), memberIdentifier, expression.Expression); if (!entityAccessor.Elements.Contains(constrain)) { entityAccessor.Elements.Add(constrain); } } else { if (constrain.ShouldBeOptional(_currentComponent)) { entityAccessor.Elements.Remove(constrain); OptionalPattern optional = new OptionalPattern(); optional.Patterns.Add(constrain); entityAccessor.Elements.Add(optional); } memberIdentifier = (Identifier)constrain.Value; } HandleComponent(memberIdentifier); _lastComponent = memberIdentifier; return(expression); }
/// <summary>Visit an optional patterns.</summary> /// <param name="optionalPattern">Optional patterns to be visited.</param> protected abstract void VisitOptionalPattern(OptionalPattern optionalPattern);
/// <summary>Default constructor with nagivated optional patterns.</summary> /// <param name="optionalPattern">Nagivated optional patterns.</param> internal OptionalPatternNavigator(OptionalPattern optionalPattern) : base(optionalPattern) { }