private static OeEntryFactory CreateEntryFactory(OeSelectItem root, Type clrType)
        {
            ParameterExpression parameter      = Expression.Parameter(typeof(Object));
            UnaryExpression     typedParameter = Expression.Convert(parameter, clrType);

            if (root.HasNavigationItems)
            {
                List <OeSelectItem> navigationItems = FlattenNavigationItems(root, false);
                IReadOnlyList <MemberExpression> navigationProperties = OeExpressionHelper.GetPropertyExpressions(typedParameter);
                for (int i = navigationItems.Count - 1; i >= 0; i--)
                {
                    OeSelectItem     navigationItem        = navigationItems[i];
                    OeEntryFactory[] nestedNavigationLinks = GetNestedNavigationLinks(navigationItem);

                    OeEntryFactory        entryFactory;
                    OePropertyAccessor[]  accessors    = GetAccessors(navigationProperties[i].Type, navigationItem.EntitySet, navigationItem.SelectItems);
                    Func <Object, Object> linkAccessor = (Func <Object, Object>)Expression.Lambda(navigationProperties[i], parameter).Compile();
                    if (i == 0)
                    {
                        entryFactory = OeEntryFactory.CreateEntryFactoryParent(navigationItem.EntitySet, accessors, nestedNavigationLinks, linkAccessor);
                    }
                    else
                    {
                        var resourceInfo = new ODataNestedResourceInfo()
                        {
                            IsCollection = navigationItem.EdmProperty.Type.Definition is EdmCollectionType,
                            Name         = navigationItem.EdmProperty.Name
                        };
                        entryFactory             = OeEntryFactory.CreateEntryFactoryNested(navigationItem.EntitySet, accessors, resourceInfo, nestedNavigationLinks, linkAccessor);
                        entryFactory.CountOption = navigationItem.ExpandedNavigationSelectItem.CountOption;
                    }
                    navigationItem.EntryFactory = entryFactory;
                }
            }
            else
            {
                IReadOnlyList <MemberExpression> propertyExpressions = OeExpressionHelper.GetPropertyExpressions(typedParameter);
                OePropertyAccessor[]             accessors;
                if (root.SelectItems.Count == 0)
                {
                    accessors = OePropertyAccessor.CreateFromType(typedParameter.Type, root.EntitySet);
                }
                else
                {
                    var accessorList = new List <OePropertyAccessor>(root.SelectItems.Count);
                    for (int i = 0; i < root.SelectItems.Count; i++)
                    {
                        OeSelectItem selectItem = root.SelectItems[i];
                        accessorList.Add(OePropertyAccessor.CreatePropertyAccessor(selectItem.EdmProperty, propertyExpressions[i], parameter, selectItem.SkipToken));
                    }
                    accessors = accessorList.ToArray();
                }
                root.EntryFactory = OeEntryFactory.CreateEntryFactory(root.EntitySet, accessors);
            }

            return(root.EntryFactory);
        }
示例#2
0
        private MethodCallExpression ApplyAggregate(Expression source, AggregateTransformationNode transformation)
        {
            Type sourceType = OeExpressionHelper.GetCollectionItemType(source.Type);
            ParameterExpression sourceParameter = Expression.Parameter(sourceType);
            ParameterExpression lambdaParameter = sourceParameter;

            var  expressions = new List <Expression>();
            bool isGroupBy   = sourceType.GetGenericTypeDefinition() == typeof(IGrouping <,>);

            if (isGroupBy)
            {
                PropertyInfo     keyProperty = sourceType.GetProperty(nameof(IGrouping <Object, Object> .Key));
                MemberExpression key         = Expression.Property(sourceParameter, keyProperty);
                expressions.Add(key);

                lambdaParameter = Expression.Parameter(sourceType.GetGenericArguments()[1]);
            }

            var visitor = CreateVisitor(lambdaParameter);

            foreach (AggregateExpressionBase aggExpressionBase in transformation.AggregateExpressions)
            {
                if (aggExpressionBase is AggregateExpression aggExpression)
                {
                    LambdaExpression aggLambda = null;
                    if (aggExpression.Expression.Kind != QueryNodeKind.Count)
                    {
                        Expression expression = visitor.TranslateNode(aggExpression.Expression);
                        if (isGroupBy && expression is MemberExpression propertyExpression)
                        {
                            MemberExpression keyPropertyExpression = FindInGroupByKey(source, expressions[0], propertyExpression);
                            if (keyPropertyExpression != null)
                            {
                                expression = keyPropertyExpression;
                            }
                        }
                        aggLambda = Expression.Lambda(expression, lambdaParameter);
                    }

                    MethodCallExpression aggCallExpression = AggCallExpression(aggExpression.Method, sourceParameter, aggLambda);
                    expressions.Add(aggCallExpression);

                    _aggProperties.Add(CreateEdmProperty(visitor.EdmModel, aggCallExpression.Type, aggExpression.Alias, false));
                }
                else
                {
                    throw new NotSupportedException("Unknown aggregate expression type " + aggExpressionBase.GetType().Name);
                }
            }

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

            return(Expression.Call(selectMethodInfo, source, lambda));
        }
示例#3
0
        protected override Object CreateEntity(ODataResourceBase resource, IReadOnlyList <NavigationInfo> navigationProperties)
        {
            Db.OeEntitySetAdapter entitySetAdapter = TestHelper.FindEntitySetAdapterByTypeName(EntitySetAdapters, resource.TypeName);
            Type entityType = entitySetAdapter.EntityType;
            var  openType   = (SortedDictionary <String, Object>)CreateEntity(entityType, resource);

            Dictionary <PropertyInfo, NavigationInfo> propertyInfos = null;

            foreach (NavigationInfo navigationInfo in navigationProperties)
            {
                Object value = navigationInfo.Value;

                if (navigationInfo.Count != null || navigationInfo.NextPageLink != null)
                {
                    PropertyInfo clrProperty = entityType.GetProperty(navigationInfo.Name);
                    if (value == null && navigationInfo.NextPageLink != null)
                    {
                        if (navigationInfo.IsCollection)
                        {
                            value = new List <SortedDictionary <String, Object> >();
                        }
                        else
                        {
                            value = new SortedDictionary <String, Object>();
                        }
                    }
                    base.NavigationProperties.Add(value, navigationInfo);

                    if (propertyInfos == null)
                    {
                        propertyInfos = new Dictionary <PropertyInfo, NavigationInfo>(navigationProperties.Count);
                        base.NavigationInfoEntities.Add(openType, propertyInfos);
                    }
                    propertyInfos.Add(clrProperty, navigationInfo);
                }

                if (value == null)
                {
                    PropertyInfo clrProprety = entityType.GetProperty(navigationInfo.Name);
                    Type         type        = OeExpressionHelper.GetCollectionItemTypeOrNull(clrProprety.PropertyType);
                    if (type == null)
                    {
                        type = clrProprety.PropertyType;
                    }

                    if (OeExpressionHelper.IsEntityType(type))
                    {
                        value = DBNull.Value;
                    }
                }

                openType.Add(navigationInfo.Name, value);
            }

            return(openType);
        }
示例#4
0
        private static MethodCallExpression CreateWhereExpression(ParameterExpression sourceParameter, Expression subquery, IEdmNavigationProperty edmNavigationProperty)
        {
            Type             subqueryType      = OeExpressionHelper.GetCollectionItemType(subquery.Type);
            var              subqueryParameter = Expression.Parameter(subqueryType, subqueryType.Name);
            BinaryExpression joinExpression    = GetJoinExpression(sourceParameter, subqueryParameter, edmNavigationProperty);
            LambdaExpression predicate         = Expression.Lambda(joinExpression, subqueryParameter);

            MethodInfo whereMethodInfo = OeMethodInfoHelper.GetWhereMethodInfo(subqueryType);

            return(Expression.Call(whereMethodInfo, subquery, predicate));
        }
        public IAsyncEnumerable <T> ExecuteReader <T>(IQueryable?source = null, CancellationToken cancellationToken = default)
        {
            IAsyncEnumerable <Object> asyncEnumerable = GetAsyncEnumerator(source);

            if (OeExpressionHelper.IsPrimitiveType(typeof(T)) || _queryContext == null || (_queryContext.EntryFactory != null && !_queryContext.EntryFactory.IsTuple))
            {
                return(Infrastructure.AsyncEnumeratorHelper.ToAsyncEnumerable <T>(asyncEnumerable, cancellationToken));
            }

            return(new Db.OeEntityAsyncEnumeratorAdapter <T>(asyncEnumerable.GetAsyncEnumerator(), _queryContext));
        }
示例#6
0
        public IAsyncEnumerable <T> ExecuteReader <T>(IQueryable source = null, bool navigationNextLink = false, int?maxPageSize = null)
        {
            OeAsyncEnumerator asyncEnumerator = GetAsyncEnumerator(source, navigationNextLink, maxPageSize);

            if (asyncEnumerator is OeAsyncEnumeratorAdapter || OeExpressionHelper.IsPrimitiveType(typeof(T)))
            {
                return(new OeAsyncEnumeratorAdapter <T>(asyncEnumerator));
            }

            return(new OeEntityAsyncEnumeratorAdapter <T>(asyncEnumerator, _queryContext));
        }
示例#7
0
        public virtual PropertyInfo[] GetPrincipalToDependentWithoutDependent(PropertyInfo propertyInfo)
        {
            Type itemType = OeExpressionHelper.GetCollectionItemTypeOrNull(propertyInfo.PropertyType);

            if (itemType != null && GetInverseProperty(propertyInfo) == null)
            {
                String dependentPropertyName = propertyInfo.DeclaringType.Name + "id";
                return(new PropertyInfo[] { itemType.GetPropertyIgnoreCase(dependentPropertyName) });
            }
            return(null);
        }
        public IAsyncEnumerable <T> ExecuteReader <T>(IQueryable source = null)
        {
            IAsyncEnumerable <Object> asyncEnumerable = GetAsyncEnumerator(source);

            if (OeExpressionHelper.IsPrimitiveType(typeof(T)) || !_queryContext.EntryFactory.IsTuple)
            {
                return(Infrastructure.AsyncEnumeratorHelper.ToAsyncEnumerable <T>(asyncEnumerable));
            }

            return(new Db.OeEntityAsyncEnumeratorAdapter <T>(asyncEnumerable.GetEnumerator(), _queryContext));
        }
        protected override Expression VisitNew(NewExpression node)
        {
            ReadOnlyCollection <Expression> arguments = base.Visit(node.Arguments);

            if (arguments == node.Arguments)
            {
                return(node);
            }

            return(OeExpressionHelper.CreateTupleExpression(arguments));
        }
        public virtual PropertyInfo[] GetPrincipalToDependentWithoutDependent(PropertyInfo principalNavigation)
        {
            Type?itemType = OeExpressionHelper.GetCollectionItemTypeOrNull(principalNavigation.PropertyType);

            if (itemType != null && GetInverseProperty(principalNavigation) == null)
            {
                String dependentPropertyName = principalNavigation.DeclaringType !.Name + "id";
                return(new PropertyInfo[] { itemType.GetPropertyIgnoreCase(dependentPropertyName) });
            }

            throw new InvalidOperationException("Pricipal structurlal property not found for principal navigation " + principalNavigation.Name);
        }
示例#11
0
        private MethodCallExpression ApplyGroupBy(Expression source, GroupByTransformationNode transformation)
        {
            Type sourceType = OeExpressionHelper.GetCollectionItemType(source.Type);
            ParameterExpression sourceParameter = Expression.Parameter(sourceType);
            var visitor = CreateVisitor(sourceParameter);

            var expressions = new List <Expression>();

            foreach (GroupByPropertyNode node in transformation.GroupingProperties)
            {
                if (node.ChildTransformations != null && node.ChildTransformations.Count > 0)
                {
                    for (int i = 0; i < node.ChildTransformations.Count; i++)
                    {
                        Expression e = visitor.TranslateNode(node.ChildTransformations[i].Expression);
                        expressions.Add(e);

                        String aliasName = node.Name + "_" + node.ChildTransformations[i].Name;
                        _aggProperties.Add(CreateEdmProperty(visitor.EdmModel, e.Type, aliasName, true));
                    }
                }
                else
                {
                    Expression e = visitor.TranslateNode(node.Expression);
                    expressions.Add(e);

                    _aggProperties.Add(CreateEdmProperty(visitor.EdmModel, e.Type, node.Name, true));
                }
            }

            NewExpression    newExpression = OeExpressionHelper.CreateTupleExpression(expressions);
            LambdaExpression lambda        = Expression.Lambda(newExpression, sourceParameter);

            MethodInfo           groupByMethodInfo = OeMethodInfoHelper.GetGroupByMethodInfo(sourceType, newExpression.Type);
            MethodCallExpression groupByCall       = Expression.Call(groupByMethodInfo, source, lambda);

            var aggTransformation = (AggregateTransformationNode)transformation.ChildTransformations;

            if (aggTransformation == null)
            {
                expressions.Clear();
                sourceType      = OeExpressionHelper.GetCollectionItemType(groupByCall.Type);
                sourceParameter = Expression.Parameter(sourceType);
                expressions.Add(Expression.Property(sourceParameter, nameof(IGrouping <Object, Object> .Key)));
                newExpression = OeExpressionHelper.CreateTupleExpression(expressions);

                MethodInfo selectMethodInfo = OeMethodInfoHelper.GetSelectMethodInfo(sourceType, newExpression.Type);
                lambda = Expression.Lambda(newExpression, sourceParameter);
                return(Expression.Call(selectMethodInfo, groupByCall, lambda));
            }

            return(ApplyAggregate(groupByCall, aggTransformation));
        }
        public virtual PropertyInfo?GetInverseProperty(PropertyInfo propertyInfo)
        {
            var inverse = (InversePropertyAttribute?)propertyInfo.GetCustomAttribute(typeof(InversePropertyAttribute));

            if (inverse == null)
            {
                return(null);
            }

            Type clrType = OeExpressionHelper.GetCollectionItemTypeOrNull(propertyInfo.PropertyType) ?? propertyInfo.PropertyType;

            return(clrType.GetPropertyIgnoreCase(inverse.Property));
        }
        public ODataResult <T> OData <T>(IAsyncEnumerable <T> asyncEnumerable)
        {
            IAsyncEnumerator <T> asyncEnumerator = asyncEnumerable.GetEnumerator();

            _httpContext.Response.RegisterForDispose(asyncEnumerator);

            if (OeExpressionHelper.IsPrimitiveType(typeof(T)) || _queryContext.ODataUri.Path.LastSegment is CountSegment)
            {
                return(new ODataPrimitiveResult <T>(_edmModel, _odataUri, asyncEnumerator));
            }

            return(new ODataResult <T>(_queryContext, asyncEnumerator));
        }
示例#14
0
        private void WriteNavigationProperty(ODataWriter writer, Object value, PropertyInfo navigationProperty)
        {
            Object navigationValue = navigationProperty.GetValue(value);

            if (!_stack.Add(navigationValue))
            {
                return;
            }

            bool isCollection = OeExpressionHelper.GetCollectionItemType(navigationProperty.PropertyType) != null;
            var  resourceInfo = new ODataNestedResourceInfo()
            {
                IsCollection = isCollection,
                Name         = navigationProperty.Name
            };

            writer.WriteStart(resourceInfo);

            if (navigationValue == null)
            {
                if (isCollection)
                {
                    writer.WriteStart(new ODataResourceSet());
                }
                else
                {
                    writer.WriteStart((ODataResource)null);
                }
                writer.WriteEnd();
            }
            else
            {
                var entityPropertiesInfo = default(EntityPropertiesInfo);
                if (isCollection)
                {
                    writer.WriteStart(new ODataResourceSet());
                    foreach (Object entity in (IEnumerable)navigationValue)
                    {
                        WriteEntry(writer, entity, ref entityPropertiesInfo);
                    }
                    writer.WriteEnd();
                }
                else
                {
                    WriteEntry(writer, navigationValue, ref entityPropertiesInfo);
                }
            }

            writer.WriteEnd();
            _stack.Remove(navigationValue);
        }
示例#15
0
        private static void SetNavigationProperty(OeEntryFactory navigationLink, Object value, Object ownerEntry)
        {
            PropertyInfo propertyInfo     = ownerEntry.GetType().GetProperty(navigationLink.ResourceInfo.Name);
            Type         nestedEntityType = OeExpressionHelper.GetCollectionItemType(propertyInfo.PropertyType);

            if (nestedEntityType == null)
            {
                nestedEntityType = propertyInfo.PropertyType;
            }

            Object navigationValue = CreateNestedEntity(navigationLink, value, nestedEntityType);

            propertyInfo.SetValue(ownerEntry, navigationValue);
        }
        private static async Task SetNavigationProperty(Db.OeDbEnumerator dbEnumerator, Object value, Object entity)
        {
            PropertyInfo propertyInfo     = entity.GetType().GetProperty(dbEnumerator.EntryFactory.ResourceInfo.Name);
            Type         nestedEntityType = OeExpressionHelper.GetCollectionItemType(propertyInfo.PropertyType);

            if (nestedEntityType == null)
            {
                nestedEntityType = propertyInfo.PropertyType;
            }

            Object navigationValue = await CreateNestedEntity(dbEnumerator, value, nestedEntityType).ConfigureAwait(false);

            propertyInfo.SetValue(entity, navigationValue);
        }
        private static Type ChangeType(Type type)
        {
            if (type == typeof(DateTimeOffset))
            {
                return(typeof(DateTime));
            }
            if (type == typeof(DateTimeOffset?))
            {
                return(typeof(DateTime?));
            }
            if (type == typeof(Decimal))
            {
                return(typeof(double));
            }
            if (type == typeof(Decimal?))
            {
                return(typeof(double?));
            }

            Type[] arguments;
            if (OeExpressionHelper.IsTupleType(type))
            {
                arguments = OeExpressionHelper.GetTupleArguments(type);
            }
            else if (IsAnonymousType(type))
            {
                PropertyInfo[] properties = type.GetProperties();
                arguments = new Type[properties.Length];
                for (int i = 0; i < arguments.Length; i++)
                {
                    arguments[i] = properties[i].PropertyType;
                }
            }
            else
            {
                return(type);
            }

            bool changed = false;

            for (int i = 0; i < arguments.Length; i++)
            {
                Type argumentType = ChangeType(arguments[i]);
                changed     |= argumentType != arguments[i];
                arguments[i] = argumentType;
            }

            return(changed ? OeExpressionHelper.GetTupleType(arguments) : type);
        }
示例#18
0
        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));
        }
示例#19
0
        private static async Task <Object> CreateEntity(IOeDbEnumerator dbEnumerator, Object value, Object entity, Type entityType, CancellationToken cancellationToken)
        {
            if (OeExpressionHelper.IsTupleType(entity.GetType()))
            {
                value  = entity;
                entity = CreateEntityFromTuple(entityType, entity, dbEnumerator.EntryFactory.Accessors);
            }

            foreach (OeEntryFactory navigationLink in dbEnumerator.EntryFactory.NavigationLinks)
            {
                await SetNavigationProperty(dbEnumerator.CreateChild(navigationLink), value, entity, cancellationToken).ConfigureAwait(false);
            }

            return(entity);
        }
示例#20
0
        public ODataResult <T> OData <T>(IAsyncEnumerable <T> asyncEnumerable)
        {
            IAsyncEnumerator <T> asyncEnumerator = asyncEnumerable.GetEnumerator();

            _httpContext.Response.RegisterForDispose(asyncEnumerator);
            if (OeExpressionHelper.IsPrimitiveType(typeof(T)))
            {
                return(new ODataPrimitiveResult <T>(_edmModel, _odataUri, asyncEnumerator));
            }

            return(new ODataResult <T>(_edmModel, _queryContext.ODataUri, _queryContext.EntryFactory.EntitySet, asyncEnumerator)
            {
                Count = (asyncEnumerator as OeAsyncEnumerator)?.Count,
                PageSize = _queryContext.PageSize
            });
        }
示例#21
0
        private static async Task <Dictionary <String, Object> > CreateEntity(Db.OeDbEnumerator dbEnumerator, Object value, Object entity)
        {
            if (OeExpressionHelper.IsTupleType(entity.GetType()))
            {
                value = entity;
            }

            Dictionary <String, Object> dictionary = CreateEntity(entity, dbEnumerator.EntryFactory.Accessors);

            foreach (OeEntryFactory navigationLink in dbEnumerator.EntryFactory.NavigationLinks)
            {
                await SetNavigationProperty(dbEnumerator.CreateChild(navigationLink), value, dictionary).ConfigureAwait(false);
            }

            return(dictionary);
        }
示例#22
0
        public static MethodCallExpression Build(Expression outer, Expression inner, ExpandedNavigationSelectItem item, ODataPath odataPath, OeExpressionBuilder expressionBuilder)
        {
            var segment = (NavigationPropertySegment)item.PathToNavigationProperty.LastSegment;

            Type       outerType      = OeExpressionHelper.GetCollectionItemType(outer.Type);
            var        outerParameter = Expression.Parameter(outerType, outerType.Name);
            Expression subquery       = CreateWhereExpression(outerParameter, inner, segment.NavigationProperty);

            subquery = expressionBuilder.ApplyOrderBy(subquery, item.OrderByOption);
            subquery = expressionBuilder.ApplySkip(subquery, item.SkipOption, odataPath);
            subquery = expressionBuilder.ApplyTake(subquery, item.TopOption, odataPath);

            Type       innerType            = OeExpressionHelper.GetCollectionItemType(inner.Type);
            MethodInfo selectManyMethdoInfo = OeMethodInfoHelper.GetSelectManyMethodInfo(outerType, innerType);

            return(Expression.Call(selectManyMethdoInfo, outer, Expression.Lambda(subquery, outerParameter)));
        }
        private static Expression GetGroupJoinKeySelector(Expression instance, IEnumerable <IEdmStructuralProperty> structuralProperties)
        {
            var expressions = new List <MemberExpression>();

            foreach (IEdmStructuralProperty edmProperty in structuralProperties)
            {
                PropertyInfo clrProperty = instance.Type.GetPropertyIgnoreCase(edmProperty);
                expressions.Add(Expression.Property(instance, clrProperty));
            }

            if (expressions.Count == 1)
            {
                return(expressions[0]);
            }

            return(OeExpressionHelper.CreateTupleExpression(expressions));
        }
示例#24
0
            public Expression GetTuplePropertyByAliasName(Expression source, SingleValueNode singleValueNode)
            {
                String aliasName = GetAliasName(singleValueNode);
                int    i         = _aggProperties.FindIndex(p => p.Name == aliasName);

                if (_aggProperties[i].IsGroup)
                {
                    return(OeExpressionHelper.GetPropertyExpressions(_aggExpressions[0])[i]);
                }

                int groupCount;

                for (groupCount = 0; groupCount < _aggProperties.Count && _aggProperties[groupCount].IsGroup; groupCount++)
                {
                }
                return(_aggExpressions[i - groupCount]);
            }
示例#25
0
        private MethodCallExpression Build(Expression outerSource, Expression innerSource, IReadOnlyList <IEdmNavigationProperty> joinPath, IEdmNavigationProperty navigationProperty, bool manyToMany)
        {
            Type outerType = OeExpressionHelper.GetCollectionItemType(outerSource.Type);
            Type innerType = OeExpressionHelper.GetCollectionItemType(innerSource.Type);

            (LambdaExpression groupJoinOuterKeySelector, LambdaExpression groupJoinInnerKeySelector) = GetJoinKeySelector(outerType, innerType, joinPath, navigationProperty);
            LambdaExpression groupJoinResultSelect = GetGroupJoinResultSelector(outerType, innerType, manyToMany);

            MethodInfo           groupJoinMethodInfo = OeMethodInfoHelper.GetGroupJoinMethodInfo(outerType, innerType, groupJoinOuterKeySelector.ReturnType, groupJoinResultSelect.ReturnType);
            MethodCallExpression groupJoinCall       = Expression.Call(groupJoinMethodInfo, outerSource, innerSource, groupJoinOuterKeySelector, groupJoinInnerKeySelector, groupJoinResultSelect);

            LambdaExpression selectManySource         = GetSelectManyCollectionSelector(groupJoinResultSelect);
            LambdaExpression selectManyResultSelector = GetSelectManyResultSelector(groupJoinResultSelect);

            MethodInfo selectManyMethodInfo = OeMethodInfoHelper.GetSelectManyMethodInfo(groupJoinResultSelect.ReturnType, innerType, selectManyResultSelector.ReturnType);

            return(Expression.Call(selectManyMethodInfo, groupJoinCall, selectManySource, selectManyResultSelector));
        }
        private static OeEntryFactory CreateEntryFactory(IEdmModel edmModel, Expression source, Type entityType, List <AggProperty> _aggProperties)
        {
            IEdmEntitySet entitySet = OeEdmClrHelper.GetEntitySet(edmModel, entityType);

            OePropertyAccessor[] accessors;
            if (_aggProperties.Count == 0)
            {
                accessors = OePropertyAccessor.CreateFromType(entityType, entitySet);
            }
            else
            {
                Type sourceItemType = OeExpressionHelper.GetCollectionItemType(source.Type);
                int  groupIndex     = _aggProperties.FindIndex(a => a.IsGroup);
                accessors = OePropertyAccessor.CreateFromTuple(sourceItemType, _aggProperties, groupIndex);
            }

            return(OeEntryFactory.CreateEntryFactory(entitySet, accessors));
        }
        public ODataResult <T> OData <T>(IAsyncEnumerable <T> asyncEnumerable)
        {
            IAsyncEnumerator <T> asyncEnumerator = asyncEnumerable.GetAsyncEnumerator();

            _httpContext.Response.OnCompleted(() => asyncEnumerator.DisposeAsync().AsTask());

            if (_odataUri != null && (OeExpressionHelper.IsPrimitiveType(typeof(T)) || _odataUri.Path.LastSegment is CountSegment))
            {
                return(new ODataPrimitiveResult <T>(_edmModel, _odataUri, asyncEnumerator));
            }

            if (_queryContext == null)
            {
                throw new InvalidOperationException("Must invoke OeAspQueryParser.ExecuteReader");
            }

            return(new ODataResult <T>(_queryContext, asyncEnumerator));
        }
示例#28
0
        public virtual PropertyDescriptor GetInverseProperty(PropertyDescriptor propertyDescriptor)
        {
            var inverse = (InversePropertyAttribute)propertyDescriptor.Attributes[typeof(InversePropertyAttribute)];

            if (inverse == null)
            {
                return(null);
            }

            Type type = OeExpressionHelper.GetCollectionItemType(propertyDescriptor.PropertyType);

            if (type == null)
            {
                type = propertyDescriptor.PropertyType;
            }

            return(TypeDescriptor.GetProperties(type)[inverse.Property]);
        }
示例#29
0
            protected override Expression VisitNew(NewExpression node)
            {
                var arguments = new Expression[node.Arguments.Count];

                for (int i = 0; i < arguments.Length; i++)
                {
                    Expression argument = base.Visit(node.Arguments[i]);
                    if (argument is MethodCallExpression call && call.Type.GetTypeInfo().IsGenericType&& call.Type.GetGenericTypeDefinition() == typeof(IOrderedEnumerable <>))
                    {
                        Type                type             = call.Type.GetGenericArguments()[0];
                        MethodInfo          selectMethodInfo = OeMethodInfoHelper.GetSelectMethodInfo(type, type);
                        ParameterExpression parameter        = Expression.Parameter(type);
                        argument = Expression.Call(selectMethodInfo, call, Expression.Lambda(parameter, parameter));
                    }
                    arguments[i] = argument;
                }
                return(OeExpressionHelper.CreateTupleExpression(arguments));
            }
示例#30
0
        private MethodCallExpression ApplyFilter(Expression source, FilterTransformationNode transformation)
        {
            Type sourceType = OeExpressionHelper.GetCollectionItemType(source.Type);
            ParameterExpression sourceParameter = Expression.Parameter(sourceType);

            var visitor = CreateVisitor(sourceParameter);

            if (_aggProperties.Count > 0)
            {
                visitor.TuplePropertyByAliasName = GetTuplePropertyByAliasName;
            }
            Expression e = visitor.TranslateNode(transformation.FilterClause.Expression);

            MethodInfo       whereMethodInfo = OeMethodInfoHelper.GetWhereMethodInfo(sourceParameter.Type);
            LambdaExpression lambda          = Expression.Lambda(e, sourceParameter);

            return(Expression.Call(whereMethodInfo, source, lambda));
        }