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.shouldWriteRawValue) { // Query options don't apply to $value. return(queryable); } HttpRequestMessageProperties properties = this.Request.ODataProperties(); ODataQueryContext queryContext = new ODataQueryContext(properties.Model, queryable.ElementType, path); ODataQueryOptions queryOptions = new ODataQueryOptions(queryContext, this.Request); // TODO GitHubIssue#41 : Ensure stable ordering for query ODataQuerySettings settings = Api.Context.GetApiService <ODataQuerySettings>(); if (this.shouldReturnCount) { // Query options other than $filter and $search don't apply to $count. queryable = queryOptions.ApplyTo( queryable, settings, AllowedQueryOptions.All ^ AllowedQueryOptions.Filter); return(queryable); } if (queryOptions.Count != null) { RestierQueryExecutorOptions queryExecutorOptions = Api.Context.GetApiService <RestierQueryExecutorOptions>(); queryExecutorOptions.IncludeTotalCount = queryOptions.Count.Value; queryExecutorOptions.SetTotalCount = value => properties.TotalCount = value; } // Validate query before apply, and query setting like MaxExpansionDepth can be customized here ODataValidationSettings validationSettings = Api.Context.GetApiService <ODataValidationSettings>(); queryOptions.Validate(validationSettings); // Entity count can NOT be evaluated at this point of time because the source // expression is just a placeholder to be replaced by the expression sourcer. queryable = queryOptions.ApplyTo(queryable, settings, AllowedQueryOptions.Count); return(queryable); }
private IQueryable ApplyQueryOptions( IQueryable queryable, ODataPath path, bool applyCount, out ETag etag) { etag = null; if (this.shouldWriteRawValue) { // Query options don't apply to $value. return(queryable); } HttpRequestMessageProperties properties = this.Request.ODataProperties(); var model = Api.GetModelAsync().Result; ODataQueryContext queryContext = new ODataQueryContext(model, queryable.ElementType, path); ODataQueryOptions queryOptions = new ODataQueryOptions(queryContext, this.Request); // Get etag for query request if (queryOptions.IfMatch != null) { etag = queryOptions.IfMatch; } else if (queryOptions.IfNoneMatch != null) { etag = queryOptions.IfNoneMatch; } // TODO GitHubIssue#41 : Ensure stable ordering for query ODataQuerySettings settings = Api.GetApiService <ODataQuerySettings>(); if (this.shouldReturnCount) { // Query options other than $filter and $search don't apply to $count. queryable = queryOptions.ApplyTo( queryable, settings, AllowedQueryOptions.All ^ AllowedQueryOptions.Filter); return(queryable); } if (queryOptions.Count != null && !applyCount) { RestierQueryExecutorOptions queryExecutorOptions = Api.GetApiService <RestierQueryExecutorOptions>(); queryExecutorOptions.IncludeTotalCount = queryOptions.Count.Value; queryExecutorOptions.SetTotalCount = value => properties.TotalCount = value; } // Validate query before apply, and query setting like MaxExpansionDepth can be customized here ODataValidationSettings validationSettings = Api.GetApiService <ODataValidationSettings>(); queryOptions.Validate(validationSettings); // Entity count can NOT be evaluated at this point of time because the source // expression is just a placeholder to be replaced by the expression sourcer. if (!applyCount) { queryable = queryOptions.ApplyTo(queryable, settings, AllowedQueryOptions.Count); } else { queryable = queryOptions.ApplyTo(queryable, settings); } return(queryable); }