public IReadOnlyDictionary <PropertyInfo, ODataResourceSetBase> GetResourceSets(Object entity)
 {
     if (NavigationPropertyEntities.TryGetValue(entity, out Dictionary <PropertyInfo, ODataResourceSetBase> resourceSets))
     {
         return(resourceSets);
     }
     return(EmptyNavigationPropertyEntities);
 }
Esempio n. 2
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);
        }
        protected IEnumerable ReadImpl(Stream response, Db.OeEntitySetMetaAdapter entitySetMetaAdatpter)
        {
            ResourceSet = null;
            NavigationProperties.Clear();
            NavigationPropertyEntities.Clear();

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

            IEdmEntitySet entitySet = EdmModel.EntityContainer.FindEntitySet(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;
                }
            }
        }