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