Пример #1
0
            protected override Expression VisitConstant(ConstantExpression node)
            {
                if (node.Value is OeEnumerableStub enumerableStub)
                {
                    IQueryable query = null;
                    if (_queryableSource != null)
                    {
                        query = _queryableSource(enumerableStub.EntitySet);
                        if (query != null && query.Expression is MethodCallExpression)
                        {
                            return(query.Expression);
                        }
                    }

                    if (query == null)
                    {
                        Db.OeEntitySetAdapter entitySetAdapter = _edmModel.GetEntitySetAdapter(enumerableStub.EntitySet);
                        query = entitySetAdapter.GetEntitySet(_dataContext);
                    }

                    return(Expression.Constant(query));
                }

                return(node);
            }
Пример #2
0
            protected override Expression VisitConstant(ConstantExpression node)
            {
                if (node.Value is OeEnumerableStub enumerableStub)
                {
                    IQueryable?query = null;
                    if (_queryableSource != null)
                    {
                        query = _queryableSource(enumerableStub.EntitySet);
                        if (query != null && query.Expression is MethodCallExpression)
                        {
                            return(query.Expression);
                        }
                    }

                    if (query == null)
                    {
                        if (_dataContext == null)
                        {
                            throw new InvalidOperationException("If function queryableSource return null dataContext must be not null");
                        }

                        Db.OeEntitySetAdapter entitySetAdapter = _edmModel.GetEntitySetAdapter(enumerableStub.EntitySet);
                        query = entitySetAdapter.GetEntitySet(_dataContext);
                    }

                    return(query.Expression);
                }

                return(node);
            }
Пример #3
0
        public Db.OeAsyncEnumerator GetAsyncEnumerator(ODataUri odataUri, Stream requestStream, OeRequestHeaders headers, Object dataContext, out bool isScalar)
        {
            isScalar = true;
            var importSegment = (OperationImportSegment)odataUri.Path.LastSegment;
            IReadOnlyList<KeyValuePair<String, Object>> parameters = OeOperationHelper.GetParameters(_edmModel, importSegment, odataUri.ParameterAliasNodes, requestStream, headers.ContentType);

            IEdmOperationImport operationImport = importSegment.OperationImports.Single();
            IEdmEntitySet entitySet = OeOperationHelper.GetEntitySet(operationImport);
            if (entitySet == null)
            {
                if (operationImport.Operation.ReturnType == null)
                    return _dataAdapter.OperationAdapter.ExecuteProcedureNonQuery(dataContext, operationImport.Name, parameters);

                Type returnType = _edmModel.GetClrType(operationImport.Operation.ReturnType.Definition);
                if (operationImport.Operation.ReturnType.IsCollection())
                {
                    isScalar = false;
                    returnType = typeof(IEnumerable<>).MakeGenericType(returnType);
                }

                if (_edmModel.IsDbFunction(operationImport.Operation))
                    return _dataAdapter.OperationAdapter.ExecuteFunctionPrimitive(dataContext, operationImport.Name, parameters, returnType);
                else
                    return _dataAdapter.OperationAdapter.ExecuteProcedurePrimitive(dataContext, operationImport.Name, parameters, returnType);
            }

            isScalar = false;
            Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet);
            if (_edmModel.IsDbFunction(operationImport.Operation))
                return _dataAdapter.OperationAdapter.ExecuteFunctionReader(dataContext, operationImport.Name, parameters, entitySetAdapter);
            else
                return _dataAdapter.OperationAdapter.ExecuteProcedureReader(dataContext, operationImport.Name, parameters, entitySetAdapter);
        }
Пример #4
0
        internal OeQueryContext(IEdmModel edmModel, ODataUri odataUri,
                                IEdmEntitySet entitySet, IReadOnlyList <OeParseNavigationSegment> parseNavigationSegments,
                                bool isCountSegment, int pageSize, bool navigationNextLink, bool isDatabaseNullHighestValue,
                                OeMetadataLevel metadataLevel, Db.OeEntitySetAdapter entitySetAdapter)
        {
            EntitySetAdapter           = entitySetAdapter;
            EdmModel                   = edmModel;
            ODataUri                   = odataUri;
            EntitySet                  = entitySet;
            ParseNavigationSegments    = parseNavigationSegments;
            IsCountSegment             = isCountSegment;
            PageSize                   = pageSize;
            NavigationNextLink         = navigationNextLink;
            IsDatabaseNullHighestValue = isDatabaseNullHighestValue;
            MetadataLevel              = metadataLevel;

            var visitor = new OeQueryNodeVisitor(edmModel, Expression.Parameter(entitySetAdapter.EntityType));

            JoinBuilder = new Translators.OeJoinBuilder(visitor);

            if (pageSize > 0 || (odataUri.OrderBy != null && odataUri.Skip != null && odataUri.Top != null))
            {
                SkipTokenNameValues = OeSkipTokenParser.CreateNameValues(edmModel, odataUri.OrderBy, odataUri.SkipToken);
            }
        }
Пример #5
0
        public override IEnumerable Read(Stream response)
        {
            String entitySetName = ResponseReader.GetEntitSetName(response);

            response.Position = 0;
            Db.OeEntitySetAdapter entitySetMetaAdatpter = TestHelper.FindEntitySetAdapterByName(base.EntitySetAdapters, entitySetName);
            return(base.Read(response, entitySetMetaAdatpter));
        }
Пример #6
0
        public virtual IEnumerable Read(Stream response)
        {
            String entitySetName = GetEntitSetName(response);

            response.Position = 0;
            Db.OeEntitySetAdapter entitySetMetaAdatpter = EntitySetAdapters.FindByEntitySetName(entitySetName);
            return(ReadImpl(response, entitySetMetaAdatpter));
        }
Пример #7
0
        public override IEnumerable Read(Stream response)
        {
            String entitySetName = ResponseReader.GetEntitSetName(response);

            response.Position = 0;
            Db.OeEntitySetAdapter entitySetMetaAdatpter = base.EntitySetAdapters.FindByEntitySetName(entitySetName);
            return(base.ReadImpl(response, entitySetMetaAdatpter));
        }
Пример #8
0
        public virtual IEnumerable Read(Stream response)
        {
            String entitySetName = GetEntitSetName(response);

            response.Position = 0;
            Db.OeEntitySetAdapter entitySetMetaAdatpter = TestHelper.FindEntitySetAdapterByName(EntitySetAdapters, entitySetName);
            return(Read(response, entitySetMetaAdatpter));
        }
Пример #9
0
        public OeQueryContext(IEdmModel edmModel, ODataUri odataUri, Db.OeEntitySetAdapter entitySetAdapter)
        {
            EdmModel         = edmModel;
            ODataUri         = odataUri;
            EntitySetAdapter = entitySetAdapter;

            ParseNavigationSegments = Array.Empty <OeParseNavigationSegment>();
            MetadataLevel           = OeMetadataLevel.Minimal;
        }
Пример #10
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);
        }
Пример #11
0
 public OeQueryContext CreateQueryContext(ODataUri odataUri, IEdmEntitySet entitySet, OeMetadataLevel metadataLevel)
 {
     OePropertyAccessor[]  accessors        = OePropertyAccessor.CreateFromType(_edmModel.GetClrType(entitySet), entitySet);
     Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet);
     return(new OeQueryContext(_edmModel, odataUri, entitySetAdapter)
     {
         EntryFactory = new OeEntryFactory(entitySet, accessors, null),
         MetadataLevel = metadataLevel
     });
 }
Пример #12
0
        public OeQueryContext CreateQueryContext(ODataUri odataUri, int pageSize, bool navigationNextLink, OeMetadataLevel metadataLevel)
        {
            List <OeParseNavigationSegment> navigationSegments = null;

            if (odataUri.Path.LastSegment is KeySegment ||
                odataUri.Path.LastSegment is NavigationPropertySegment)
            {
                navigationSegments = new List <OeParseNavigationSegment>();
                ODataPathSegment previousSegment = null;
                foreach (ODataPathSegment segment in odataUri.Path)
                {
                    if (segment is NavigationPropertySegment navigationSegment)
                    {
                        navigationSegments.Add(new OeParseNavigationSegment(navigationSegment, null));
                    }
                    else if (segment is KeySegment keySegment)
                    {
                        IEdmEntitySet previousEntitySet;
                        navigationSegment = null;
                        if (previousSegment is EntitySetSegment)
                        {
                            var previousEntitySetSegment = previousSegment as EntitySetSegment;
                            previousEntitySet = previousEntitySetSegment.EntitySet;
                        }
                        else if (previousSegment is NavigationPropertySegment)
                        {
                            navigationSegment = previousSegment as NavigationPropertySegment;
                            previousEntitySet = (IEdmEntitySet)navigationSegment.NavigationSource;
                        }
                        else
                        {
                            throw new InvalidOperationException("invalid segment");
                        }

                        FilterClause keyFilter = CreateFilterClause(previousEntitySet, keySegment.Keys);
                        navigationSegments.Add(new OeParseNavigationSegment(navigationSegment, keyFilter));
                    }
                    previousSegment = segment;
                }
            }

            var entitySetSegment = (EntitySetSegment)odataUri.Path.FirstSegment;

            if (pageSize > 0)
            {
                odataUri.Top = pageSize;
                IEdmEntitySet resultEntitySet = OeParseNavigationSegment.GetEntitySet(navigationSegments) ?? entitySetSegment.EntitySet;
                odataUri.OrderBy = OeSkipTokenParser.GetUniqueOrderBy(_edmModel, resultEntitySet, odataUri.OrderBy, odataUri.Apply);
            }

            Db.OeEntitySetAdapter entitySetAdapter = _edmModel.GetEntitySetAdapter(entitySetSegment.EntitySet);
            bool isCountSegment = odataUri.Path.LastSegment is CountSegment;

            return(new OeQueryContext(_edmModel, odataUri, navigationSegments, isCountSegment, pageSize, navigationNextLink, metadataLevel, entitySetAdapter));
        }
        private static Db.OeEntitySetAdapterCollection CreateEntitySetAdapters(DynamicTypeDefinitionManager typeDefinitionManager)
        {
            var entitySetAdapters = new Db.OeEntitySetAdapter[typeDefinitionManager.TypeDefinitions.Count];
            int i = 0;

            foreach (DynamicTypeDefinition typeDefinition in typeDefinitionManager.TypeDefinitions)
            {
                entitySetAdapters[i++] = CreateEntitySetAdapter(typeDefinition.DynamicTypeType, typeDefinition.TableEdmName, typeDefinition.IsQueryType);
            }
            return(new Db.OeEntitySetAdapterCollection(entitySetAdapters));
        }
Пример #14
0
            protected override Expression VisitConstant(ConstantExpression node)
            {
                if (node.Type.IsGenericType && (node.Type.GetGenericTypeDefinition() == typeof(IEnumerable <>) || node.Type.GetGenericTypeDefinition() == typeof(IQueryable <>)))
                {
                    Db.OeEntitySetAdapter entitySetAdapter = _entitySetAdapters.FindByClrType(node.Type.GetGenericArguments()[0]);
                    IQueryable            query            = entitySetAdapter.GetEntitySet(_dataContext);
                    return(Expression.Constant(query));
                }

                return(base.VisitConstant(node));
            }
Пример #15
0
        public static ODataResult <T> OData <T>(this HttpContext httpContext, IEnumerable <T> entities)
        {
            var edmModel = (IEdmModel)httpContext.RequestServices.GetService(typeof(IEdmModel));
            var odataUri = new ODataUri()
            {
                ServiceRoot = UriHelper.GetBaseUri(httpContext.Request)
            };

            Db.OeEntitySetAdapter entitySetAdapter = GetEntitySetAdapter(edmModel, typeof(T));
            IEdmEntitySet         entitySet        = edmModel.EntityContainer.FindEntitySet(entitySetAdapter.EntitySetName);

            return(new ODataResult <T>(edmModel, odataUri, entitySet, entities.ToAsyncEnumerable().GetEnumerator()));
        }
Пример #16
0
        public OeQueryContext(IEdmModel edmModel, ODataUri odataUri, Db.OeEntitySetAdapter entitySetAdapter)
        {
            EdmModel         = edmModel;
            ODataUri         = odataUri;
            EntitySetAdapter = entitySetAdapter;

            var visitor = new OeQueryNodeVisitor(Expression.Parameter(entitySetAdapter.EntityType));

            _joinBuilder            = new Translators.OeJoinBuilder(visitor);
            MetadataLevel           = OeMetadataLevel.Minimal;
            ParseNavigationSegments = Array.Empty <OeParseNavigationSegment>();
            SkipTokenNameValues     = Array.Empty <OeSkipTokenNameValue>();
        }
Пример #17
0
        protected virtual Object CreateEntity(ODataResourceBase resource, IReadOnlyList <NavigationInfo> navigationProperties)
        {
            Db.OeEntitySetAdapter entitySetAdapter = TestHelper.FindEntitySetAdapterByTypeName(EntitySetAdapters, resource.TypeName);
            Object entity = CreateEntity(entitySetAdapter.EntityType, resource);
            Dictionary <PropertyInfo, NavigationInfo> propertyInfos = null;

            foreach (NavigationInfo navigationInfo in navigationProperties)
            {
                PropertyInfo clrProperty = entitySetAdapter.EntityType.GetProperty(navigationInfo.Name);
                Object       value       = navigationInfo.Value;

                if ((navigationInfo.Count == null && navigationInfo.NextPageLink == null))
                {
                    if (clrProperty.GetSetMethod() != null)
                    {
                        clrProperty.SetValue(entity, value);
                    }
                }
                else
                {
                    if (value == null && navigationInfo.NextPageLink != null)
                    {
                        if (navigationInfo.IsCollection)
                        {
                            value = CreateCollection(clrProperty.PropertyType);
                        }
                        else
                        {
                            value = Activator.CreateInstance(clrProperty.PropertyType);
                        }
                    }

                    clrProperty.SetValue(entity, value);
                    if (value != null)
                    {
                        NavigationProperties.Add(value, navigationInfo);
                    }

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

            return(entity);
        }
Пример #18
0
            private ConstantExpression GetQueryConstantExpression(Expression node)
            {
                if (node.Type.IsGenericType && node.Type.GetGenericTypeDefinition() == typeof(IQueryable <>))
                {
                    Db.OeEntitySetAdapter entitySetAdapter = _entitySetAdapters.FindByClrType(node.Type.GetGenericArguments()[0]);
                    IQueryable            query            = entitySetAdapter.GetEntitySet(_dataContext);
                    if (_query == null && entitySetAdapter.EntityType == typeof(T))
                    {
                        _query = (IQueryable <T>)query;
                    }

                    return(Expression.Constant(query));
                }

                return(null);
            }
Пример #19
0
        public OeQueryContext CreateQueryContext(ODataUri odataUri, OeMetadataLevel metadataLevel)
        {
            var importSegment = (OperationImportSegment)odataUri.Path.FirstSegment;
            IEdmEntitySet entitySet = OeOperationHelper.GetEntitySet(importSegment.OperationImports.Single());
            if (entitySet == null)
                return null;

            Type clrType = _edmModel.GetClrType(entitySet.EntityType());
            OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(clrType, entitySet);

            Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet);
            return new OeQueryContext(_edmModel, odataUri, null, false, 0, false, metadataLevel, entitySetAdapter)
            {
                EntryFactory = OeEntryFactory.CreateEntryFactory(entitySet, accessors),
            };
        }
Пример #20
0
        private static Db.OeEntitySetAdapter GetEntitySetAdapter(IEdmModel edmModel, Type entityType)
        {
            Db.OeDataAdapter      dataAdapter      = edmModel.GetDataAdapter(edmModel.EntityContainer);
            Db.OeEntitySetAdapter entitySetAdapter = dataAdapter.EntitySetAdapters.Find(entityType);
            if (entitySetAdapter != null)
            {
                return(entitySetAdapter);
            }

            foreach (IEdmModel refModel in edmModel.ReferencedModels)
            {
                return(GetEntitySetAdapter(refModel, entityType));
            }

            throw new InvalidOperationException("Entity type " + entityType.FullName + " not found in edm model");
        }
Пример #21
0
        public OeQueryContext CreateQueryContext(ODataUri odataUri, int pageSize, bool navigationNextLink, OeMetadataLevel metadataLevel)
        {
            IReadOnlyList <OeParseNavigationSegment> navigationSegments = OeParseNavigationSegment.GetNavigationSegments(odataUri.Path);
            var entitySetSegment = (EntitySetSegment)odataUri.Path.FirstSegment;

            if (pageSize > 0)
            {
                odataUri.Top = pageSize;
                IEdmEntitySet resultEntitySet = OeParseNavigationSegment.GetEntitySet(navigationSegments) ?? entitySetSegment.EntitySet;
                odataUri.OrderBy = OeSkipTokenParser.GetUniqueOrderBy(_edmModel, resultEntitySet, odataUri.OrderBy, odataUri.Apply);
            }

            Db.OeEntitySetAdapter entitySetAdapter = _edmModel.GetEntitySetAdapter(entitySetSegment.EntitySet);
            bool isCountSegment = odataUri.Path.LastSegment is CountSegment;

            return(new OeQueryContext(_edmModel, odataUri, navigationSegments, isCountSegment, pageSize, navigationNextLink, metadataLevel, entitySetAdapter));
        }
Пример #22
0
        private static Db.OeEntitySetAdapterCollection CreateEntitySetAdapters(IModel efModel)
        {
            var entitySetAdapters = new List <Db.OeEntitySetAdapter>();

            foreach (PropertyInfo property in typeof(T).GetProperties())
            {
                if (typeof(IQueryable).IsAssignableFrom(property.PropertyType))
                {
                    Type entityType = property.PropertyType.GetGenericArguments()[0];
                    bool isDbQuery  = efModel.FindEntityType(entityType).FindPrimaryKey() == null;
                    Db.OeEntitySetAdapter entitySetAdapter = CreateEntitySetAdapter(entityType, property.Name, isDbQuery);
                    entitySetAdapters.Add(entitySetAdapter);
                }
            }

            return(new Db.OeEntitySetAdapterCollection(entitySetAdapters.ToArray()));
        }
Пример #23
0
        public OeQueryContext CreateQueryContext(ODataUri odataUri, OeMetadataLevel metadataLevel)
        {
            var           importSegment = (OperationImportSegment)odataUri.Path.FirstSegment;
            IEdmEntitySet entitySet     = OeOperationHelper.GetEntitySet(importSegment.OperationImports.Single());

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

            OePropertyAccessor[]  accessors        = OePropertyAccessor.CreateFromType(_edmModel.GetClrType(entitySet), entitySet);
            Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet);
            return(new OeQueryContext(_edmModel, odataUri, entitySetAdapter)
            {
                EntryFactory = new OeEntryFactory(entitySet, accessors, Array.Empty <OePropertyAccessor>()),
                MetadataLevel = metadataLevel
            });
        }
Пример #24
0
        protected Object CreateEntity(ODataResource resource, IReadOnlyList <NavigationProperty> navigationProperties)
        {
            Db.OeEntitySetAdapter entitySetAdapter = EntitySetAdapters.FindByTypeName(resource.TypeName);
            Object entity = OeEdmClrHelper.CreateEntity(entitySetAdapter.EntityType, resource);
            Dictionary <PropertyInfo, ODataResourceSetBase> propertyInfos = null;

            foreach (NavigationProperty navigationProperty in navigationProperties)
            {
                PropertyInfo clrProperty = entitySetAdapter.EntityType.GetProperty(navigationProperty.Name);
                Object       value       = navigationProperty.Value;

                if (navigationProperty.ResourceSet == null || (navigationProperty.ResourceSet.Count == null && navigationProperty.ResourceSet.NextPageLink == null))
                {
                    if (clrProperty.GetSetMethod() != null)
                    {
                        clrProperty.SetValue(entity, value);
                    }
                    continue;
                }

                if (value == null && navigationProperty.ResourceSet.NextPageLink != null)
                {
                    value = CreateCollection(clrProperty.PropertyType);
                }

                clrProperty.SetValue(entity, value);
                if (value is IEnumerable collection)
                {
                    NavigationProperties.Add(collection, navigationProperty.ResourceSet);

                    if (propertyInfos == null)
                    {
                        propertyInfos = new Dictionary <PropertyInfo, ODataResourceSetBase>(navigationProperties.Count);
                        NavigationPropertyEntities.Add(entity, propertyInfos);
                    }
                    propertyInfos.Add(clrProperty, navigationProperty.ResourceSet);
                }
            }

            return(entity);
        }
Пример #25
0
        internal OeQueryContext(IEdmModel edmModel, ODataUri odataUri,
                                IEdmEntitySet entitySet, IReadOnlyList <OeParseNavigationSegment> parseNavigationSegments,
                                bool isCountSegment, int pageSize, bool navigationNextLink, bool isDatabaseNullHighestValue,
                                OeMetadataLevel metadataLevel, ref Db.OeEntitySetAdapter entitySetAdapter)
        {
            EntitySetAdapter        = entitySetAdapter;
            EdmModel                = edmModel;
            ODataUri                = odataUri;
            EntitySet               = entitySet;
            ParseNavigationSegments = parseNavigationSegments;
            IsCountSegment          = isCountSegment;
            PageSize                = pageSize;
            NavigationNextLink      = navigationNextLink;
            MetadataLevel           = metadataLevel;

            if (pageSize > 0 || (odataUri.OrderBy != null && odataUri.Skip != null && odataUri.Top != null))
            {
                IEdmEntityType edmEntityType = OeGetParser.GetEntityType(odataUri.Path, parseNavigationSegments);
                SkipTokenParser = new OeSkipTokenParser(edmModel, edmEntityType, isDatabaseNullHighestValue, odataUri.OrderBy);
            }
        }
Пример #26
0
        private void AddToEntitySet(Object dataContext, OeOperationMessage operation)
        {
            Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.GetEntitySetAdapter(operation.EntityItem.EntitySet.Name);
            switch (operation.Method)
            {
            case ODataConstants.MethodDelete:
                entitySetAdapter.RemoveEntity(dataContext, operation.EntityItem.Entity);
                break;

            case ODataConstants.MethodPatch:
                entitySetAdapter.AttachEntity(dataContext, operation.EntityItem.Entity);
                break;

            case ODataConstants.MethodPost:
                entitySetAdapter.AddEntity(dataContext, operation.EntityItem.Entity);
                break;

            default:
                throw new NotImplementedException(operation.Method);
            }
        }
Пример #27
0
        protected IEnumerable Read(Stream response, Db.OeEntitySetAdapter entitySetMetaAdatpter)
        {
            ResourceSet = null;
            NavigationProperties.Clear();
            NavigationInfoEntities.Clear();

            IODataResponseMessage responseMessage = new Infrastructure.OeInMemoryMessage(response, null, _serviceProvider);
            var settings = new ODataMessageReaderSettings()
            {
                EnableMessageStreamDisposal = false, Validations = ValidationKinds.None
            };

            using (var messageReader = new ODataMessageReader(responseMessage, settings, EdmModel))
            {
                IEdmEntitySet entitySet = OeEdmClrHelper.GetEntitySet(EdmModel, entitySetMetaAdatpter.EntitySetName);
                ODataReader   reader    = messageReader.CreateODataResourceSetReader(entitySet, entitySet.EntityType());

                var stack = new Stack <StackItem>();
                while (reader.Read())
                {
                    switch (reader.State)
                    {
                    case ODataReaderState.ResourceSetStart:
                        if (stack.Count == 0)
                        {
                            ResourceSet = (ODataResourceSetBase)reader.Item;
                        }
                        else
                        {
                            stack.Peek().ResourceSet = (ODataResourceSetBase)reader.Item;
                        }
                        break;

                    case ODataReaderState.ResourceStart:
                        stack.Push(new StackItem((ODataResource)reader.Item));
                        break;

                    case ODataReaderState.ResourceEnd:
                        StackItem stackItem = stack.Pop();

                        if (reader.Item != null)
                        {
                            if (stack.Count == 0)
                            {
                                yield return(CreateRootEntity((ODataResource)stackItem.Item, stackItem.NavigationProperties, entitySetMetaAdatpter.EntityType));
                            }
                            else
                            {
                                stack.Peek().AddEntry(CreateEntity((ODataResource)stackItem.Item, stackItem.NavigationProperties));
                            }
                        }
                        break;

                    case ODataReaderState.NestedResourceInfoStart:
                        stack.Push(new StackItem((ODataNestedResourceInfo)reader.Item));
                        break;

                    case ODataReaderState.NestedResourceInfoEnd:
                        StackItem item = stack.Pop();
                        stack.Peek().AddLink((ODataNestedResourceInfo)item.Item, item.Value, item.ResourceSet);
                        break;
                    }
                }
            }
        }
Пример #28
0
 public IEnumerable <T> Read <T>(Stream response)
 {
     Db.OeEntitySetAdapter entitySetMetaAdatpter = TestHelper.FindEntitySetAdapterByClrType(EntitySetAdapters, typeof(T));
     return(Read(response, entitySetMetaAdatpter).Cast <T>());
 }
Пример #29
0
        public EdmModel BuildEdmModel(params IEdmModel[] refModels)
        {
            AddOperations();

            Dictionary <Type, EntityTypeInfo> entityTypeInfos = BuildEntityTypes(refModels);

            foreach (EntityTypeInfo typeInfo in entityTypeInfos.Values)
            {
                if (!typeInfo.IsRefModel)
                {
                    typeInfo.BuildProperties(entityTypeInfos, _enumTypes, _complexTypes);
                }
            }

            foreach (EntityTypeInfo typeInfo in entityTypeInfos.Values)
            {
                if (!typeInfo.IsRefModel)
                {
                    foreach (FKeyInfo fkeyInfo in typeInfo.NavigationClrProperties)
                    {
                        fkeyInfo.BuildNavigationProperty();
                    }
                }
            }

            var edmModel = new EdmModel(false);

            edmModel.AddElements(_enumTypes.Values);
            foreach (KeyValuePair <Type, EdmEnumType> enumType in _enumTypes)
            {
                edmModel.SetClrType(enumType.Value, enumType.Key);
            }

            edmModel.AddElements(_complexTypes.Values);
            foreach (KeyValuePair <Type, EdmComplexType> complexType in _complexTypes)
            {
                edmModel.SetClrType(complexType.Value, complexType.Key);
            }

            var container = new EdmEntityContainer(_dataAdapter.DataContextType.Namespace, _dataAdapter.DataContextType.Name);

            edmModel.SetDataAdapter(container, _dataAdapter);

            var entitySets = new Dictionary <IEdmEntityType, EdmEntitySet>(entityTypeInfos.Count);

            foreach (EntityTypeInfo typeInfo in entityTypeInfos.Values)
            {
                if (!typeInfo.IsRefModel)
                {
                    edmModel.AddElement(typeInfo.EdmType);
                    edmModel.SetClrType(typeInfo.EdmType, typeInfo.ClrType);
                }

                Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(typeInfo.ClrType);
                if (entitySetAdapter != null)
                {
                    EdmEntitySet entitySet = container.AddEntitySet(entitySetAdapter.EntitySetName, typeInfo.EdmType);
                    edmModel.SetEntitySetAdapter(entitySet, entitySetAdapter);
                    entitySets.Add(typeInfo.EdmType, entitySet);
                }
            }

            var manyToManyBuilder = new ManyToManyBuilder(edmModel, _metadataProvider, entityTypeInfos);

            foreach (EntityTypeInfo typeInfo in entityTypeInfos.Values)
            {
                if (!typeInfo.IsRefModel)
                {
                    foreach (FKeyInfo fkeyInfo in typeInfo.NavigationClrProperties)
                    {
                        EdmEntitySet principal = entitySets[fkeyInfo.PrincipalInfo.EdmType];
                        EdmEntitySet dependent = entitySets[fkeyInfo.DependentInfo.EdmType];

                        if (fkeyInfo.DependentNavigationProperty == null)
                        {
                            principal.AddNavigationTarget(fkeyInfo.EdmNavigationProperty, dependent);
                        }
                        else
                        {
                            dependent.AddNavigationTarget(fkeyInfo.EdmNavigationProperty, principal);
                            if (fkeyInfo.EdmNavigationProperty.Partner != null)
                            {
                                principal.AddNavigationTarget(fkeyInfo.EdmNavigationProperty.Partner, dependent);
                            }
                        }
                    }

                    manyToManyBuilder.Build(typeInfo);
                }
            }

            foreach (OeOperationConfiguration operationConfiguration in _operationConfigurations)
            {
                if (operationConfiguration.IsEdmFunction)
                {
                    EdmFunction edmFunction = BuildFunction(operationConfiguration, entityTypeInfos);
                    edmModel.AddElement(edmFunction);

                    if (edmFunction.IsBound)
                    {
                        edmModel.SetMethodInfo(edmFunction, operationConfiguration.MethodInfo);
                    }
                    else
                    {
                        container.AddFunctionImport(operationConfiguration.ImportName, edmFunction, edmFunction.EntitySetPath);
                        edmModel.SetIsDbFunction(edmFunction, operationConfiguration.IsDbFunction);
                    }
                }
                else
                {
                    EdmAction edmAction = BuildAction(operationConfiguration, entityTypeInfos);
                    edmModel.AddElement(edmAction);
                    container.AddActionImport(operationConfiguration.ImportName, edmAction);
                    edmModel.SetIsDbFunction(edmAction, operationConfiguration.IsDbFunction);
                }
            }

            edmModel.AddElement(container);
            _dataAdapter.SetEdmModel(edmModel);
            foreach (IEdmModel refModel in refModels)
            {
                edmModel.AddReferencedModel(refModel);
            }

            return(edmModel);
        }
Пример #30
0
 protected override IAsyncEnumerable <Object> ExecuteReader(Object dataContext, String sql, IReadOnlyList <KeyValuePair <String, Object?> > parameters,
                                                            Db.OeEntitySetAdapter entitySetAdapter)
 {
     throw new NotSupportedException();
 }