Exemple #1
0
        private Expression GetInnerSource(OeSelectItem navigationItem, ExpandedNavigationSelectItem item)
        {
            Type         clrEntityType         = _visitor.EdmModel.GetClrType(navigationItem.EdmProperty.DeclaringType);
            PropertyInfo navigationClrProperty = OeEdmClrHelper.GetPropertyIgnoreCase(clrEntityType, navigationItem.EdmProperty);

            Type itemType = OeExpressionHelper.GetCollectionItemType(navigationClrProperty.PropertyType);

            if (itemType == null)
            {
                itemType = navigationClrProperty.PropertyType;
            }

            var visitor           = new OeQueryNodeVisitor(_visitor, Expression.Parameter(itemType));
            var expressionBuilder = new OeExpressionBuilder(_joinBuilder, visitor);

            Expression innerSource = Expression.Constant(null, typeof(IEnumerable <>).MakeGenericType(itemType));

            innerSource = expressionBuilder.ApplyFilter(innerSource, item.FilterOption);
            if (item.SkipOption != null || item.TopOption != null)
            {
                Expression source = Expression.Constant(null, typeof(IEnumerable <>).MakeGenericType(navigationClrProperty.DeclaringType));
                innerSource = OeCrossApplyBuilder.Build(source, innerSource, item, navigationItem.Path, expressionBuilder);
            }

            return(innerSource);
        }
Exemple #2
0
        private Expression GetInnerSource(OeSelectItem navigationItem, ExpandedNavigationSelectItem item)
        {
            Type         clrEntityType         = _visitor.EdmModel.GetClrType(navigationItem.EdmProperty.DeclaringType);
            PropertyInfo navigationClrProperty = clrEntityType.GetPropertyIgnoreCase(navigationItem.EdmProperty);

            Type itemType = OeExpressionHelper.GetCollectionItemType(navigationClrProperty.PropertyType);

            if (itemType == null)
            {
                itemType = navigationClrProperty.PropertyType;
            }

            var visitor           = new OeQueryNodeVisitor(_visitor, Expression.Parameter(itemType));
            var expressionBuilder = new OeExpressionBuilder(_joinBuilder, visitor);

            var navigationEdmProperty = (IEdmNavigationProperty)navigationItem.EdmProperty;

            if (navigationEdmProperty.ContainsTarget)
            {
                ModelBuilder.ManyToManyJoinDescription joinDescription = _visitor.EdmModel.GetManyToManyJoinDescription(navigationEdmProperty);
                navigationEdmProperty = joinDescription.TargetNavigationProperty;
            }
            IEdmEntitySet innerEntitySet = OeEdmClrHelper.GetEntitySet(_visitor.EdmModel, navigationEdmProperty);
            Expression    innerSource    = OeEnumerableStub.CreateEnumerableStubExpression(itemType, innerEntitySet);

            innerSource = expressionBuilder.ApplyFilter(innerSource, item.FilterOption);
            if (item.SkipOption != null || item.TopOption != null)
            {
                Expression source = OeEnumerableStub.CreateEnumerableStubExpression(navigationClrProperty.DeclaringType, (IEdmEntitySet)_navigationItem.EntitySet);
                innerSource = OeCrossApplyBuilder.Build(source, innerSource, item, navigationItem.Path, expressionBuilder);
            }

            return(innerSource);
        }
Exemple #3
0
 internal OeSelectTranslator(OeJoinBuilder joinBuilder, OeSelectItem navigationItem)
 {
     _joinBuilder    = joinBuilder;
     _navigationItem = navigationItem;
     _visitor        = joinBuilder.Visitor;
     _metadataLevel  = OeMetadataLevel.None;
 }
Exemple #4
0
 public OeSelectItemTranslator(OeSelectItem navigationItem, bool navigationNextLink,
                               Expression source, OeJoinBuilder joinBuilder, bool skipToken)
 {
     _navigationItem     = navigationItem;
     _navigationNextLink = navigationNextLink;
     _source             = source;
     _joinBuilder        = joinBuilder;
     _skipToken          = skipToken;
     _visitor            = joinBuilder.Visitor;
 }
        private Expression GetInnerSource(OeNavigationSelectItem navigationItem)
        {
            if (navigationItem.Parent == null)
            {
                throw new InvalidOperationException("Inner source cannot exist for root item");
            }

            Type         clrEntityType         = _edmModel.GetClrType(navigationItem.EdmProperty.DeclaringType);
            PropertyInfo navigationClrProperty = clrEntityType.GetPropertyIgnoreCase(navigationItem.EdmProperty);

            Type itemType          = OeExpressionHelper.GetCollectionItemTypeOrNull(navigationClrProperty.PropertyType) ?? navigationClrProperty.PropertyType;
            var  visitor           = new OeQueryNodeVisitor(_joinBuilder.Visitor, Expression.Parameter(itemType));
            var  expressionBuilder = new OeExpressionBuilder(_joinBuilder, visitor);

            IEdmNavigationProperty navigationProperty = navigationItem.EdmProperty;

            if (navigationItem.EdmProperty.ContainsTarget)
            {
                ModelBuilder.ManyToManyJoinDescription joinDescription = _edmModel.GetManyToManyJoinDescription(navigationProperty);
                navigationProperty = joinDescription.TargetNavigationProperty;
            }
            IEdmEntitySet innerEntitySet = OeEdmClrHelper.GetEntitySet(_edmModel, navigationProperty);
            Expression    innerSource    = OeEnumerableStub.CreateEnumerableStubExpression(itemType, innerEntitySet);

            ExpandedNavigationSelectItem item = navigationItem.NavigationSelectItem;

            innerSource = expressionBuilder.ApplyFilter(innerSource, item.FilterOption);

            long?top = GetTop(navigationItem, item.TopOption);

            if (top == null && item.SkipOption == null)
            {
                return(innerSource);
            }

            OrderByClause orderByClause = item.OrderByOption;

            if (navigationItem.PageSize > 0)
            {
                orderByClause = OeSkipTokenParser.GetUniqueOrderBy(navigationItem.EntitySet, item.OrderByOption, null);
            }

            var        entitySet = (IEdmEntitySet)navigationItem.Parent.EntitySet;
            Expression source    = OeEnumerableStub.CreateEnumerableStubExpression(navigationClrProperty.DeclaringType, entitySet);

            var crossApplyBuilder = new OeCrossApplyBuilder(_edmModel, expressionBuilder);

            return(crossApplyBuilder.Build(source, innerSource, navigationItem.Path, orderByClause, item.SkipOption, top));
        }
Exemple #6
0
        private IEnumerable <KeyValuePair <String, Object> > GetKeys(T entity)
        {
            var           visitor       = new OeQueryNodeVisitor(_edmModel, Expression.Parameter(typeof(T)));
            OrderByClause orderByClause = _odataUri.OrderBy;

            do
            {
                var             propertyExpression = (MemberExpression)visitor.TranslateNode(orderByClause.Expression);
                UnaryExpression body = Expression.Convert(propertyExpression, typeof(Object));
                Expression <Func <T, Object> > getValueLambda = Expression.Lambda <Func <T, Object> >(body, visitor.Parameter);
                Object value = getValueLambda.Compile()(entity);

                yield return(new KeyValuePair <String, Object>(OeSkipTokenParser.GetPropertyName(propertyExpression), value));

                orderByClause = orderByClause.ThenBy;
            }while (orderByClause != null);
        }
        private static void SetOrderByProperties(OeQueryContext queryContext, Object entity, Object value)
        {
            var visitor = new OeQueryNodeVisitor(queryContext.EdmModel, Expression.Parameter(typeof(T)));
            var setPropertyValueVisitor = new SetPropertyValueVisitor();

            int           i             = 0;
            OrderByClause orderByClause = queryContext.ODataUri.OrderBy;

            while (orderByClause != null)
            {
                var    propertyExpression = (MemberExpression)visitor.TranslateNode(orderByClause.Expression);
                Object orderValue         = queryContext.SkipTokenAccessors[i++].GetValue(value);
                setPropertyValueVisitor.SetPropertyValue(entity, propertyExpression, orderValue);

                orderByClause = orderByClause.ThenBy;
            }
        }
        private void SetOrderByProperties(Object entity, Object value)
        {
            var visitor = new OeQueryNodeVisitor(_skipTokenParser.EdmModel, Expression.Parameter(typeof(T)));
            var setPropertyValueVisitor = new SetPropertyValueVisitor();

            int           i             = 0;
            OrderByClause orderByClause = _skipTokenParser.UniqueOrderBy;

            while (orderByClause != null)
            {
                var    propertyExpression = (MemberExpression)visitor.TranslateNode(orderByClause.Expression);
                Object orderValue         = _skipTokenParser.Accessors[i++].Accessor(value);
                setPropertyValueVisitor.SetPropertyValue(entity, propertyExpression, orderValue);

                orderByClause = orderByClause.ThenBy;
            }
        }
Exemple #9
0
        private MethodCallExpression ApplyCompute(Expression source, ComputeTransformationNode transformation)
        {
            var expressions = new List <Expression>();

            Type sourceType = OeExpressionHelper.GetCollectionItemType(source.Type);
            ParameterExpression sourceParameter = Expression.Parameter(sourceType);

            if (_aggProperties.Count > 0)
            {
                var callExpression = (MethodCallExpression)source;
                source = callExpression.Arguments[0];
                var aggLambda = (LambdaExpression)callExpression.Arguments[1];
                expressions.AddRange(((NewExpression)aggLambda.Body).Arguments);

                sourceType      = OeExpressionHelper.GetCollectionItemType(source.Type);
                sourceParameter = aggLambda.Parameters[0];
            }

            OeQueryNodeVisitor visitor = CreateVisitor(sourceParameter);

            if (_aggProperties.Count > 0)
            {
                visitor.TuplePropertyByAliasName = new ComputeAliasNameResolver(_aggProperties, expressions).GetTuplePropertyByAliasName;
            }

            foreach (ComputeExpression computeExpression in transformation.Expressions)
            {
                Expression expression = visitor.TranslateNode(computeExpression.Expression);
                expressions.Add(expression);

                _aggProperties.Add(CreateEdmProperty(visitor.EdmModel, expression.Type, computeExpression.Alias, false));
            }

            NewExpression    newExpression    = OeExpressionHelper.CreateTupleExpression(expressions);
            MethodInfo       selectMethodInfo = OeMethodInfoHelper.GetSelectMethodInfo(sourceParameter.Type, newExpression.Type);
            LambdaExpression lambda           = Expression.Lambda(newExpression, sourceParameter);

            return(Expression.Call(selectMethodInfo, source, lambda));
        }
 public OeJoinBuilder(OeQueryNodeVisitor visitor)
 {
     Visitor    = visitor;
     _joinPaths = new List <IEdmNavigationProperty[]>();
 }
Exemple #11
0
 public OeAggregationTranslator(OeQueryNodeVisitor visitor)
 {
     _visitor       = visitor;
     _aggProperties = new List <AggProperty>();
 }
 public OeSkipTokenTranslator(OeQueryNodeVisitor visitor, OeJoinBuilder joinBuilder, bool isDatabaseNullHighestValue)
 {
     _visitor     = visitor;
     _joinBuilder = joinBuilder;
     _isDatabaseNullHighestValue = isDatabaseNullHighestValue;
 }
Exemple #13
0
 internal OeSelectTranslator(OeJoinBuilder joinBuilder, OeSelectItem navigationItem)
 {
     _joinBuilder    = joinBuilder;
     _navigationItem = navigationItem;
     _visitor        = joinBuilder.Visitor;
 }
Exemple #14
0
 public DollarItVisitor(OeQueryNodeVisitor parentVisitor, ParameterExpression parameter, IEdmModel edmModel)
     : base(parentVisitor, parameter)
 {
     _edmModel = edmModel;
 }