Ejemplo n.º 1
0
        /// <summary>
        /// Parses a Querystring into DynamicQueryOptions instance.
        /// </summary>
        /// <param name="query">QueryString to parse.</param>
        /// <param name="opShortCodes">Custom operation shortcodes.</param>
        /// <returns>Parsed DynamicQueryOptions instance.</returns>
        public static DynamicQueryOptions ParseQueryOptions(string query, CustomOpCodes opShortCodes = null)
        {
            try
            {
                var dynamicQueryOptions = new DynamicQueryOptions();
                if (string.IsNullOrEmpty(query))
                {
                    return(dynamicQueryOptions);
                }

                ////+ character issue
                ////https://docs.microsoft.com/en-us/dotnet/api/system.web.httputility.urlencode?redirectedfrom=MSDN&view=net-5.0#System_Web_HttpUtility_UrlEncode_System_String_
                if (QueryStringParser.IsQueryStringEncoded(query))
                {
                    query = HttpUtility.UrlDecode(query);
                }

                DynamicQueryOptions innerQueryOptions = null;
                const string        innerMemberKey    = "v=(";
                int indexOfInnerMemberKey             = query.IndexOf(innerMemberKey, StringComparison.Ordinal);
                if (indexOfInnerMemberKey != -1)
                {
                    indexOfInnerMemberKey += innerMemberKey.Length;
                    string innerQuery = query.Substring(indexOfInnerMemberKey, query.LastIndexOf(')') - indexOfInnerMemberKey);
                    innerQueryOptions = ParseQueryOptions(innerQuery, opShortCodes);
                    query             = query.Replace(innerQuery, string.Empty);
                }

                string[]            defaultArrayValue = new string[0];
                NameValueCollection queryCollection   = HttpUtility.ParseQueryString(query);

                IEnumerable <QueryStringParserResult> queryStringParserResults = QueryStringParser
                                                                                 .GetAllParameterWithValue(query)
                                                                                 .Where(e => !string.IsNullOrEmpty(e.Value) && e.Value.Contains(InternalConstants.PLUS_CHARACTER)).ToList();
                if (queryStringParserResults.Any())
                {
                    QueryStringParser.ReplaceNameValueCollection(queryStringParserResults, queryCollection, InternalConstants.PARAMETER_VALUE_KEY);
                }

                string[] operations = queryCollection
                                      .GetValues(InternalConstants.OPERATION_PARAMETER_KEY)
                                      ?.Select(x => x.ClearSpaces())
                                      .ToArray() ?? defaultArrayValue;

                string[] parameterNames = queryCollection
                                          .GetValues(InternalConstants.PARAMETER_NAME_KEY)
                                          ?.Select(x => x.ClearSpaces())
                                          .ToArray() ?? defaultArrayValue;

                string[] parameterValues = queryCollection
                                           .GetValues(InternalConstants.PARAMETER_VALUE_KEY)
                                           ?.ToArray() ?? defaultArrayValue;

                string[] sortOptions = queryCollection
                                       .GetValues(InternalConstants.SORT_OPTIONS_PARAMETER_KEY)
                                       ?.Select(x => x.ClearSpaces())
                                       .ToArray() ?? defaultArrayValue;

                string[] offsetOptions = queryCollection
                                         .GetValues(InternalConstants.OFFSET_PARAMETER_KEY)
                                         ?.Select(x => x.ClearSpaces())
                                         .ToArray() ?? defaultArrayValue;

                string[] countOptions = queryCollection
                                        .GetValues(InternalConstants.COUNT_PARAMETER_KEY)
                                        ?.Select(x => x.ClearSpaces())
                                        .ToArray() ?? defaultArrayValue;

                PopulateDynamicQueryOptions(
                    dynamicQueryOptions,
                    operations,
                    parameterNames,
                    parameterValues,
                    sortOptions,
                    offsetOptions,
                    countOptions,
                    opShortCodes: opShortCodes ?? Defaults.DefaultOpShortCodes,
                    memberQueryOptions: innerQueryOptions);

                return(dynamicQueryOptions);
            }
            catch (Exception ex)
            {
                throw new DynamicQueryException("DynamicQueryBuilder has encountered an unhandled exception", query, ex);
            }
        }