Exemplo n.º 1
0
        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);
        }