private void ReadCollectionParameter(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.CreateODataUriParameterResourceSetReader((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); } } } }
private static object ConvertResourceSet(ODataMessageReader oDataMessageReader, IEdmTypeReference edmTypeReference, ODataDeserializerContext readContext) { IEdmCollectionTypeReference collectionType = edmTypeReference.AsCollection(); EdmEntitySet tempEntitySet = null; if (collectionType.ElementType().IsEntity()) { tempEntitySet = new EdmEntitySet(readContext.Model.EntityContainer, "temp", collectionType.ElementType().AsEntity().EntityDefinition()); } // TODO: Sam xu, can we use the parameter-less overload ODataReader odataReader = oDataMessageReader.CreateODataUriParameterResourceSetReader(tempEntitySet, collectionType.ElementType().AsStructured().StructuredDefinition()); ODataResourceSetWrapper resourceSet = odataReader.ReadResourceOrResourceSet() as ODataResourceSetWrapper; ODataDeserializerProvider deserializerProvider = readContext.Request.GetDeserializerProvider(); ODataResourceSetDeserializer resourceSetDeserializer = (ODataResourceSetDeserializer)deserializerProvider.GetEdmTypeDeserializer(collectionType); object result = resourceSetDeserializer.ReadInline(resourceSet, collectionType, readContext); IEnumerable enumerable = result as IEnumerable; if (enumerable != null) { IEnumerable newEnumerable = enumerable; if (collectionType.ElementType().IsEntity()) { newEnumerable = CovertResourceSetIds(enumerable, resourceSet, collectionType, readContext); } if (readContext.IsUntyped) { return(newEnumerable.ConvertToEdmObject(collectionType)); } else { IEdmTypeReference elementTypeReference = collectionType.ElementType(); Type elementClrType = EdmLibHelpers.GetClrType(elementTypeReference, readContext.Model); IEnumerable castedResult = CastMethodInfo.MakeGenericMethod(elementClrType) .Invoke(null, new object[] { newEnumerable }) as IEnumerable; return(castedResult); } } return(null); }
/// <summary> /// Parse the constant entity collection node. /// </summary> /// <param name="nodeIn">The input constant node.</param> /// <returns>The parsed object.</returns> private object ParseEntityCollection(ConstantNode nodeIn) { ODataMessageReaderSettings settings = new ODataMessageReaderSettings(); InMemoryMessage message = new InMemoryMessage() { Stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(nodeIn.LiteralText)), }; var resourceType = ((nodeIn.TypeReference.Definition as IEdmCollectionType).ElementType as IEdmStructuredTypeReference) .Definition as IEdmStructuredType; object list = null; MethodInfo addMethod = null; using ( ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, settings, this.UriParser.Model)) { if (nodeIn.LiteralText.Contains("@odata.id")) { ODataEntityReferenceLinks referenceLinks = reader.ReadEntityReferenceLinks(); foreach (var referenceLink in referenceLinks.Links) { var queryContext = new QueryContext(this.UriParser.ServiceRoot, referenceLink.Url, this.DataSource.Model, this.UriParser.Container); var target = queryContext.ResolveQuery(this.DataSource); if (list == null) { // create the list. This would require the first type is not derived type. Type listType = typeof(List <>).MakeGenericType(target.GetType()); addMethod = listType.GetMethod("Add"); list = Activator.CreateInstance(listType); } addMethod.Invoke(list, new[] { target }); } return(list); } var entityType = resourceType as IEdmEntityType; var feedReader = reader.CreateODataUriParameterResourceSetReader( entityType == null ? null : new EdmEntitySet(new EdmEntityContainer("NS", "Test"), "TestType", entityType), resourceType); return(ODataObjectModelConverter.ReadEntityOrEntityCollection(feedReader, true)); } }