public IReadOnlyDictionary <PropertyInfo, ODataResourceSetBase> GetResourceSets(Object entity) { if (NavigationPropertyEntities.TryGetValue(entity, out Dictionary <PropertyInfo, ODataResourceSetBase> resourceSets)) { return(resourceSets); } return(EmptyNavigationPropertyEntities); }
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; } } }