private static object ConvertResource(ODataMessageReader oDataMessageReader, IEdmTypeReference edmTypeReference, ODataDeserializerContext readContext) { EdmEntitySet tempEntitySet = null; if (edmTypeReference.IsEntity()) { IEdmEntityTypeReference entityType = edmTypeReference.AsEntity(); tempEntitySet = new EdmEntitySet(readContext.Model.EntityContainer, "temp", entityType.EntityDefinition()); } // TODO: Sam xu, can we use the parameter-less overload ODataReader resourceReader = oDataMessageReader.CreateODataUriParameterResourceReader(tempEntitySet, edmTypeReference.ToStructuredType()); object item = resourceReader.ReadResourceOrResourceSet(); ODataResourceWrapper topLevelResource = item as ODataResourceWrapper; Contract.Assert(topLevelResource != null); ODataDeserializerProvider deserializerProvider = readContext.Request.GetDeserializerProvider(); ODataResourceDeserializer entityDeserializer = (ODataResourceDeserializer)deserializerProvider.GetEdmTypeDeserializer(edmTypeReference); return(entityDeserializer.ReadInline(topLevelResource, edmTypeReference, readContext)); }
/// <summary> /// Parse the constant entity node. /// </summary> /// <param name="nodeIn">The input constant node.</param> /// <returns>The parsed object.</returns> private object ParseEntity(ConstantNode nodeIn) { ODataMessageReaderSettings settings = new ODataMessageReaderSettings(); InMemoryMessage message = new InMemoryMessage() { Stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(nodeIn.LiteralText)), }; var resourceType = (nodeIn.TypeReference as IEdmStructuredTypeReference).Definition as IEdmStructuredType; using ( ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, settings, this.UriParser.Model)) { if (nodeIn.LiteralText.Contains("@odata.id")) { ODataEntityReferenceLink referenceLink = reader.ReadEntityReferenceLink(); var queryContext = new QueryContext(this.UriParser.ServiceRoot, referenceLink.Url, this.DataSource.Model, this.UriParser.Container); var target = queryContext.ResolveQuery(this.DataSource); return(target); } var entityType = resourceType as IEdmEntityType; var entryReader = reader.CreateODataUriParameterResourceReader( entityType == null ? null : new EdmEntitySet(new EdmEntityContainer("NS", "Test"), "TestType", entityType), resourceType); return(ODataObjectModelConverter.ReadEntityOrEntityCollection(entryReader, false)); } }
private void ReadSingletonParameter(string payload, IEdmStructuredType resourceType, out List <ODataResourceSet> resourceSets, out List <ODataResource> resources, out List <ODataNestedResourceInfo> nestedResourceInfos) { var message = new InMemoryMessage() { Stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)) }; var settings = new ODataMessageReaderSettings(); using (var msgReader = new ODataMessageReader((IODataRequestMessage)message, settings, model)) { var reader = msgReader.CreateODataUriParameterResourceReader((resourceType == null || resourceType is IEdmComplexType) ? null : peopleSet, resourceType); resources = new List <ODataResource>(); nestedResourceInfos = new List <ODataNestedResourceInfo>(); resourceSets = new List <ODataResourceSet>(); while (reader.Read()) { if (reader.State == ODataReaderState.ResourceEnd) { resources.Add(reader.Item as ODataResource); } else if (reader.State == ODataReaderState.NestedResourceInfoEnd) { nestedResourceInfos.Add(reader.Item as ODataNestedResourceInfo); } else if (reader.State == ODataReaderState.ResourceSetEnd) { resourceSets.Add(reader.Item as ODataResourceSet); } } } }