/// <summary> /// Writes the entity result to the response message. /// </summary> /// <param name="graph">The entity result to write.</param> /// <param name="type">The type of the entity.</param> /// <param name="messageWriter">The message writer.</param> /// <param name="writeContext">The writing context.</param> public override void WriteObject( object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) { PrimitiveResult primitiveResult = graph as PrimitiveResult; if (primitiveResult != null) { graph = primitiveResult.Result; } if (writeContext != null) { graph = ConvertToPayloadValue(writeContext.Model, graph); } base.WriteObject(graph, type, messageWriter, writeContext); }
private HttpResponseMessage CreateQueryResponse(IQueryable query, IEdmType edmType) { IEdmTypeReference typeReference = GetTypeReference(edmType); // TODO, GitHubIssue#328 : 404 should be returned when requesting property of non-exist entity BaseSingleResult singleResult = null; HttpResponseMessage response = null; if (typeReference.IsPrimitive()) { if (this.shouldReturnCount || this.shouldWriteRawValue) { var rawResult = new RawResult(query, typeReference, this.Api.Context); singleResult = rawResult; response = this.Request.CreateResponse(HttpStatusCode.OK, rawResult); } else { var primitiveResult = new PrimitiveResult(query, typeReference, this.Api.Context); singleResult = primitiveResult; response = this.Request.CreateResponse(HttpStatusCode.OK, primitiveResult); } } if (typeReference.IsComplex()) { var complexResult = new ComplexResult(query, typeReference, this.Api.Context); singleResult = complexResult; response = this.Request.CreateResponse(HttpStatusCode.OK, complexResult); } if (typeReference.IsEnum()) { if (this.shouldWriteRawValue) { var rawResult = new RawResult(query, typeReference, this.Api.Context); singleResult = rawResult; response = this.Request.CreateResponse(HttpStatusCode.OK, rawResult); } else { var enumResult = new EnumResult(query, typeReference, this.Api.Context); singleResult = enumResult; response = this.Request.CreateResponse(HttpStatusCode.OK, enumResult); } } if (singleResult != null) { if (singleResult.Result == null) { // Per specification, If the property is single-valued and has the null value, // the service responds with 204 No Content. return(this.Request.CreateResponse(HttpStatusCode.NoContent)); } return(response); } if (typeReference.IsCollection()) { var elementType = typeReference.AsCollection().ElementType(); if (elementType.IsPrimitive() || elementType.IsComplex() || elementType.IsEnum()) { return(this.Request.CreateResponse( HttpStatusCode.OK, new NonEntityCollectionResult(query, typeReference, this.Api.Context))); } return(this.Request.CreateResponse( HttpStatusCode.OK, new EntityCollectionResult(query, typeReference, this.Api.Context))); } var entityResult = new EntityResult(query, typeReference, this.Api.Context); if (entityResult.Result == null) { // TODO GitHubIssue#288: 204 expected when requesting single nav propery which has null value // ~/People(nonexistkey) and ~/People(nonexistkey)/BestFriend, expected 404 // ~/People(key)/BestFriend, and BestFriend is null, expected 204 throw new HttpResponseException( this.Request.CreateErrorResponse( HttpStatusCode.NotFound, Resources.ResourceNotFound)); } // TODO GitHubIssue#43 : support non-Entity ($select/$value) queries return(this.Request.CreateResponse(HttpStatusCode.OK, entityResult)); }
private IActionResult CreateQueryResponse(IQueryable query, IEdmType edmType, ETag etag) { var typeReference = GetTypeReference(edmType); BaseSingleResult singleResult = null; IActionResult response = null; if (typeReference.IsPrimitive()) { if (shouldReturnCount || shouldWriteRawValue) { var rawResult = new RawResult(query, typeReference); singleResult = rawResult; response = Ok(rawResult); } else { var primitiveResult = new PrimitiveResult(query, typeReference); singleResult = primitiveResult; response = Ok(primitiveResult); } } if (typeReference.IsComplex()) { var complexResult = new ComplexResult(query, typeReference); singleResult = complexResult; response = Ok(complexResult); } if (typeReference.IsEnum()) { if (shouldWriteRawValue) { var rawResult = new RawResult(query, typeReference); singleResult = rawResult; response = Ok(rawResult); } else { var enumResult = new EnumResult(query, typeReference); singleResult = enumResult; response = Ok(enumResult); } } if (singleResult != null) { if (singleResult.Result == null) { // Per specification, If the property is single-valued and has the null value, // the service responds with 204 No Content. return(NoContent()); } return(response); } if (typeReference.IsCollection()) { var elementType = typeReference.AsCollection().ElementType(); if (elementType.IsPrimitive() || elementType.IsEnum()) { return(Ok(new NonResourceCollectionResult(query, typeReference))); } return(Ok(new ResourceSetResult(query, typeReference))); } var entityResult = query.SingleOrDefault(); if (entityResult == null) { return(NoContent()); } // Check the ETag here if (etag != null) { // request with If-Match header, if match, then should return whole content // request with If-Match header, if not match, then should return 412 // request with If-None-Match header, if match, then should return 304 // request with If-None-Match header, if not match, then should return whole content etag.EntityType = query.ElementType; query = etag.ApplyTo(query); entityResult = query.SingleOrDefault(); if (entityResult == null && !etag.IsIfNoneMatch) { return(StatusCode((int)HttpStatusCode.PreconditionFailed)); } else if (entityResult == null) { return(StatusCode((int)HttpStatusCode.NotModified)); } } return(Ok(entityResult)); }