public virtual object ApplyQueryOptions(object value, HttpRequest request, ActionDescriptor descriptor) { var elementClrType = TypeHelper.GetImplementedIEnumerableType(value.GetType()); var model = request.ODataProperties().Model; if (model == null) { throw Error.InvalidOperation(SRResources.QueryGetModelMustNotReturnNull); } var queryContext = new ODataQueryContext( model, elementClrType, request.ODataProperties().Path); var queryOptions = new ODataQueryOptions(queryContext, request); var enumerable = value as IEnumerable; if (enumerable == null) { // response is single entity. return value; } // response is a collection. var query = (value as IQueryable) ?? enumerable.AsQueryable(); return queryOptions.ApplyTo(query, new ODataQuerySettings { HandleNullPropagation = HandleNullPropagationOption.True }); }
private IQueryable GetQuery() { ODataPath path = this.GetPath(); RestierQueryBuilder builder = new RestierQueryBuilder(this.Api, path); IQueryable queryable = builder.BuildQuery(); this.shouldReturnCount = builder.IsCountPathSegmentPresent; this.shouldWriteRawValue = builder.IsValuePathSegmentPresent; if (queryable == null) { throw new HttpResponseException( this.Request.CreateErrorResponse( HttpStatusCode.NotFound, Resources.ResourceNotFound)); } if (this.shouldReturnCount || this.shouldWriteRawValue) { // Query options don't apply to $count or $value. return queryable; } ODataQueryContext queryContext = new ODataQueryContext(this.Request.ODataProperties().Model, queryable.ElementType, path); ODataQueryOptions queryOptions = new ODataQueryOptions(queryContext, this.Request); // TODO GitHubIssue#41 : Ensure stable ordering for query ODataQuerySettings settings = new ODataQuerySettings() { HandleNullPropagation = HandleNullPropagationOption.False, EnsureStableOrdering = true, EnableConstantParameterization = false, PageSize = null, // no support for server enforced PageSize, yet }; queryable = queryOptions.ApplyTo(queryable, settings); return queryable; }