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;
                }
            }
        }