public virtual object ApplyQueryOptions(object value, HttpRequest request, ActionDescriptor actionDescriptor, AssembliesResolver assembliesResolver) { var elementClrType = value is IEnumerable ? TypeHelper.GetImplementedIEnumerableType(value.GetType()) : value.GetType(); var model = request.ODataProperties().Model; if (model == null) { throw Error.InvalidOperation(SRResources.QueryGetModelMustNotReturnNull); } var queryContext = new ODataQueryContext( model, elementClrType, assembliesResolver, request.ODataProperties().Path ); var queryOptions = new ODataQueryOptions(queryContext, request, assembliesResolver); 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(); query = queryOptions.ApplyTo(query, new ODataQuerySettings { // TODO: If we are using SQL, set this to false // otherwise if it is entities in code then // set it to true HandleNullPropagation = //HandleNullPropagationOption.True HandleNullPropagationOptionHelper.GetDefaultHandleNullPropagationOption(query), PageSize = actionDescriptor.PageSize(), SearchDerivedTypeWhenAutoExpand = true }, AllowedQueryOptions.None); // Determine if this result should be a single entity if (ODataCountMediaTypeMapping.IsCountRequest(request)) { long?count = request.ODataProperties().TotalCount; if (count.HasValue) { // Return the count value if it is a $count request. return(count.Value); } } return(query); }
/// <summary> /// Applies the query to the given entity based on incoming query from uri and query settings. /// </summary> /// <param name="query">The original entity from the response message.</param> /// <param name="queryOptions"> /// The <see cref="ODataQueryOptions"/> instance constructed based on the incoming request. /// </param> /// <param name="shouldApplyQuery"></param> /// <param name="actionDescriptor"></param> /// <returns>The new entity after the $select and $expand query has been applied to.</returns> protected virtual async Task <IQueryable> ApplyQueryAsync(IQueryable query, ODataQueryOptions queryOptions, bool shouldApplyQuery) { if (query == null) { throw Error.ArgumentNull("entity"); } if (queryOptions == null) { throw Error.ArgumentNull("queryOptions"); } query = (IQueryable) await InvokeInterceptorsAsync(query, queryOptions.Context.ElementClrType, queryOptions, QuerySettings); if (shouldApplyQuery) { // TODO: If we are using SQL, set this to false // otherwise if it is entities in code then // set it to true QuerySettings.HandleNullPropagation = //HandleNullPropagationOption.True HandleNullPropagationOptionHelper.GetDefaultHandleNullPropagationOption(query); //PageSize = actionDescriptor.PageSize(), //var pageSize = ResolvePageSize(settings, actionDescriptor); query = queryOptions.ApplyTo(query, new ODataQuerySettings { HandleNullPropagation = HandleNullPropagationOption.False }, PageSize, queryOptions); } return(query); }
public static ODataQuerySettings UpdateQuerySettings(this ODataQueryContext context, ODataQuerySettings querySettings, IQueryable query) { ODataQuerySettings updatedSettings = context.RequestContainer.GetRequiredService <ODataQuerySettings>(); updatedSettings.CopyFrom(querySettings); if (updatedSettings.HandleNullPropagation == HandleNullPropagationOption.Default) { updatedSettings.HandleNullPropagation = query != null ? HandleNullPropagationOptionHelper.GetDefaultHandleNullPropagationOption(query) : HandleNullPropagationOption.True; } return(updatedSettings); }