private static object CovertResourceId(object source, ODataResource resource, IEdmEntityTypeReference entityTypeReference, ODataDeserializerContext readContext) { Contract.Assert(resource != null); Contract.Assert(source != null); if (resource.Id == null || resource.Properties.Any()) { return(source); } IWebApiRequestMessage request = readContext.InternalRequest; IWebApiUrlHelper urlHelper = readContext.InternalUrlHelper; DefaultODataPathHandler pathHandler = new DefaultODataPathHandler(); string serviceRoot = urlHelper.CreateODataLink( request.Context.RouteName, request.PathHandler, new List <ODataPathSegment>()); IEnumerable <KeyValuePair <string, object> > keyValues = GetKeys(pathHandler, serviceRoot, resource.Id, request.RequestContainer); IList <IEdmStructuralProperty> keys = entityTypeReference.Key().ToList(); if (keys.Count == 1 && keyValues.Count() == 1) { // TODO: make sure the enum key works object propertyValue = keyValues.First().Value; DeserializationHelpers.SetDeclaredProperty(source, EdmTypeKind.Primitive, keys[0].Name, propertyValue, keys[0], readContext); return(source); } IDictionary <string, object> keyValuesDic = keyValues.ToDictionary(e => e.Key, e => e.Value); foreach (IEdmStructuralProperty key in keys) { object value; if (keyValuesDic.TryGetValue(key.Name, out value)) { // TODO: make sure the enum key works DeserializationHelpers.SetDeclaredProperty(source, EdmTypeKind.Primitive, key.Name, value, key, readContext); } } return(source); }
private static Uri GenerateQueryFromExpandedItem(ODataSerializerContext writeContext, Uri navigationLink) { IWebApiUrlHelper urlHelper = writeContext.InternalUrlHelper; if (urlHelper == null) { return(navigationLink); } string serviceRoot = urlHelper.CreateODataLink( writeContext.InternalRequest.Context.RouteName, writeContext.InternalRequest.PathHandler, new List <ODataPathSegment>()); Uri serviceRootUri = new Uri(serviceRoot); ODataUriParser parser = new ODataUriParser(writeContext.Model, serviceRootUri, navigationLink); ODataUri newUri = parser.ParseUri(); newUri.SelectAndExpand = writeContext.SelectExpandClause; if (writeContext.CurrentExpandedSelectItem != null) { newUri.OrderBy = writeContext.CurrentExpandedSelectItem.OrderByOption; newUri.Filter = writeContext.CurrentExpandedSelectItem.FilterOption; newUri.Skip = writeContext.CurrentExpandedSelectItem.SkipOption; newUri.Top = writeContext.CurrentExpandedSelectItem.TopOption; if (writeContext.CurrentExpandedSelectItem.CountOption != null) { if (writeContext.CurrentExpandedSelectItem.CountOption.HasValue) { newUri.QueryCount = writeContext.CurrentExpandedSelectItem.CountOption.Value; } } ExpandedNavigationSelectItem expandedNavigationItem = writeContext.CurrentExpandedSelectItem as ExpandedNavigationSelectItem; if (expandedNavigationItem != null) { newUri.SelectAndExpand = expandedNavigationItem.SelectAndExpand; } } ODataUrlKeyDelimiter keyDelimiter = writeContext.InternalRequest.Options.UrlKeyDelimiter == ODataUrlKeyDelimiter.Slash ? ODataUrlKeyDelimiter.Slash : ODataUrlKeyDelimiter.Parentheses; return(newUri.BuildUri(keyDelimiter)); }
internal static void WriteToStream( Type type, object value, IEdmModel model, ODataVersion version, Uri baseAddress, MediaTypeHeaderValue contentType, IWebApiUrlHelper internaUrlHelper, IWebApiRequestMessage internalRequest, IWebApiHeaders internalRequestHeaders, Func <IServiceProvider, ODataMessageWrapper> getODataMessageWrapper, Func <IEdmTypeReference, ODataSerializer> getEdmTypeSerializer, Func <Type, ODataSerializer> getODataPayloadSerializer, Func <ODataSerializerContext> getODataSerializerContext) { if (model == null) { throw Error.InvalidOperation(SRResources.RequestMustHaveModel); } ODataSerializer serializer = GetSerializer(type, value, internalRequest, getEdmTypeSerializer, getODataPayloadSerializer); ODataPath path = internalRequest.Context.Path; IEdmNavigationSource targetNavigationSource = path == null ? null : path.NavigationSource; // serialize a response string preferHeader = RequestPreferenceHelpers.GetRequestPreferHeader(internalRequestHeaders); string annotationFilter = null; if (!String.IsNullOrEmpty(preferHeader)) { ODataMessageWrapper messageWrapper = getODataMessageWrapper(null); messageWrapper.SetHeader(RequestPreferenceHelpers.PreferHeaderName, preferHeader); annotationFilter = messageWrapper.PreferHeader().AnnotationFilter; } IODataResponseMessage responseMessage = getODataMessageWrapper(internalRequest.RequestContainer); if (annotationFilter != null) { responseMessage.PreferenceAppliedHeader().AnnotationFilter = annotationFilter; } ODataMessageWriterSettings writerSettings = internalRequest.WriterSettings; writerSettings.BaseUri = baseAddress; writerSettings.Version = version; writerSettings.Validations = writerSettings.Validations & ~ValidationKinds.ThrowOnUndeclaredPropertyForNonOpenType; string metadataLink = internaUrlHelper.CreateODataLink(MetadataSegment.Instance); if (metadataLink == null) { throw new SerializationException(SRResources.UnableToDetermineMetadataUrl); } //Set this variable if the SelectExpandClause is different from the processed clause on the Query options SelectExpandClause selectExpandDifferentFromQueryOptions = null; if (internalRequest.Context.QueryOptions != null && internalRequest.Context.QueryOptions.SelectExpand != null) { if (internalRequest.Context.QueryOptions.SelectExpand.ProcessedSelectExpandClause != internalRequest.Context.ProcessedSelectExpandClause) { selectExpandDifferentFromQueryOptions = internalRequest.Context.ProcessedSelectExpandClause; } } else if (internalRequest.Context.ProcessedSelectExpandClause != null) { selectExpandDifferentFromQueryOptions = internalRequest.Context.ProcessedSelectExpandClause; } writerSettings.ODataUri = new ODataUri { ServiceRoot = baseAddress, SelectAndExpand = internalRequest.Context.ProcessedSelectExpandClause, Apply = internalRequest.Context.ApplyClause, Path = ConvertPath(path), }; ODataMetadataLevel metadataLevel = ODataMetadataLevel.MinimalMetadata; if (contentType != null) { IEnumerable <KeyValuePair <string, string> > parameters = contentType.Parameters.Select(val => new KeyValuePair <string, string>(val.Name, val.Value)); metadataLevel = ODataMediaTypes.GetMetadataLevel(contentType.MediaType, parameters); } using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, writerSettings, model)) { ODataSerializerContext writeContext = getODataSerializerContext(); writeContext.NavigationSource = targetNavigationSource; writeContext.Model = model; writeContext.RootElementName = GetRootElementName(path) ?? "root"; writeContext.SkipExpensiveAvailabilityChecks = serializer.ODataPayloadKind == ODataPayloadKind.ResourceSet; writeContext.Path = path; writeContext.MetadataLevel = metadataLevel; writeContext.QueryOptions = internalRequest.Context.QueryOptions; //Set the SelectExpandClause on the context if it was explicitly specified. if (selectExpandDifferentFromQueryOptions != null) { writeContext.SelectExpandClause = selectExpandDifferentFromQueryOptions; } serializer.WriteObject(value, type, messageWriter, writeContext); } }