public override void OnResultExecuted(ResultExecutedContext resultExecutedContext) { base.OnResultExecuted(resultExecutedContext); if (resultExecutedContext == null) { throw new ArgumentNullException("resultExecutedContext", "Cannot apply OData Query with a null execution context."); } if (resultExecutedContext.HttpContext == null) { throw new ArgumentException("The HttpContext was null. Could not process OData Query request."); } var response = resultExecutedContext.HttpContext.Response; var request = resultExecutedContext.HttpContext.Request; var result = resultExecutedContext.Result; if (result != null) { var resultType = result.GetType(); var responseType = resultType.GetGenericArguments().Single(); var url = request.RawUrl; var uri = new Uri(url); var queryString = uri.Query; if (typeof(IQueryable).IsAssignableFrom(responseType) && (String.IsNullOrWhiteSpace(queryString) == false)) { var itemType = responseType.GetGenericArguments().Single(); var parser = new ODataUriParser(new ODataQueryParser(new ODataQueryPartParserStrategy()), new ExpressionODataQueryVisitor(new FilterExpressionBuilder())); var expression = parser.Parse(itemType, uri); var fn = expression.Compile(); // TODO: need to pass in current result here var data = fn.DynamicInvoke(); var actionResult = Activator.CreateInstance(resultType) as ActionResult; resultExecutedContext.Result = actionResult; } } }
public override void OnResultExecuted(ResultExecutedContext resultExecutedContext) { base.OnResultExecuted(resultExecutedContext); if (resultExecutedContext == null) { throw new ArgumentNullException("resultExecutedContext", "Cannot apply OData Query with a null execution context."); } if (resultExecutedContext.HttpContext == null) { throw new ArgumentException("The HttpContext was null. Could not process OData Query request."); } var response = resultExecutedContext.HttpContext.Response; var request = resultExecutedContext.HttpContext.Request; var result = resultExecutedContext.Result; if (result != null) { var resultType = result.GetType(); var responseType = resultType.GetGenericArguments().Single(); var url = request.RawUrl; var uri = new Uri(url); var queryString = uri.Query; if (typeof (IQueryable).IsAssignableFrom(responseType) && (String.IsNullOrWhiteSpace(queryString) == false)) { var itemType = responseType.GetGenericArguments().Single(); var parser = new ODataUriParser(new ODataQueryParser(new ODataQueryPartParserStrategy()), new ExpressionODataQueryVisitor(new FilterExpressionBuilder())); var expression = parser.Parse(itemType, uri); var fn = expression.Compile(); // TODO: need to pass in current result here var data = fn.DynamicInvoke(); var actionResult = Activator.CreateInstance(resultType) as ActionResult; resultExecutedContext.Result = actionResult; } } }
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { if (actionExecutedContext == null) { throw new ArgumentNullException(nameof(actionExecutedContext)); } if (actionExecutedContext.Request == null) { throw new ArgumentException("The HttpActionExecutedContext cannot contain a null HttpRequestMessage."); } var request = actionExecutedContext.Request; var response = actionExecutedContext.Response; IQueryable query; if ((response != null) && response.TryGetContentValue(out query)) { if ((request.RequestUri != null) && (String.IsNullOrWhiteSpace(request.RequestUri.Query) == false)) { var itemType = query.ElementType; var requestUri = request.RequestUri; var parser = new ODataUriParser(new ODataQueryParser(new ODataQueryPartParserStrategy()), new ExpressionODataQueryVisitor(new FilterExpressionBuilder())); var expression = parser.Parse(itemType, requestUri); var fn = expression.Compile(); var result = fn.DynamicInvoke(query); var oldContent = (ObjectContent)response.Content; var newContent = new ObjectContent(expression.ReturnType, result, oldContent.Formatter, oldContent.Headers.ContentType.MediaType); response.Content = newContent; } } }
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { if (actionExecutedContext == null) { throw new ArgumentNullException(nameof (actionExecutedContext)); } if (actionExecutedContext.Request == null) { throw new ArgumentException("The HttpActionExecutedContext cannot contain a null HttpRequestMessage."); } var request = actionExecutedContext.Request; var response = actionExecutedContext.Response; IQueryable query; if ((response != null) && response.TryGetContentValue(out query)) { if ((request.RequestUri != null) && (String.IsNullOrWhiteSpace(request.RequestUri.Query) == false)) { var itemType = query.ElementType; var requestUri = request.RequestUri; var parser = new ODataUriParser(new ODataQueryParser(new ODataQueryPartParserStrategy()), new ExpressionODataQueryVisitor(new FilterExpressionBuilder())); var expression = parser.Parse(itemType, requestUri); var fn = expression.Compile(); var result = fn.DynamicInvoke(query); var oldContent = (ObjectContent) response.Content; var newContent = new ObjectContent(expression.ReturnType, result, oldContent.Formatter, oldContent.Headers.ContentType.MediaType); response.Content = newContent; } } }