private bool AddStatement(bool isFirst, FilterStatement filterStatement, List <object> parameterList, StringBuilder whereBuilder, EntitySqlFilterOperationParameters operationParameters)
        {
            var currentIndex = parameterList.Count;

            var value = FilterTypeCorrector.ChangeType <TFilterableEntity>(filterStatement.ParameterName, filterStatement.ParameterValue);

            if (value == null)
            {
                return(false);
            }

            parameterList.Add(value);

            if (!isFirst)
            {
                if (filterStatement.LogicalOperator == FilterLogicalOperators.Or)
                {
                    whereBuilder.Append(" OR ");
                }
                else
                {
                    whereBuilder.Append(" AND ");
                }
            }

            var columnName = CreateColumnName(filterStatement.ParameterName, operationParameters);

            CreateLogicalOperation(whereBuilder, columnName, currentIndex, filterStatement.ComparisonOperator);

            return(true);
        }
        private ISpecification <TEntity> Create(FilterStatement filter)
        {
            var property = typeof(TEntity).GetPropertyInfoIgnoreCase(filter.ParameterName);

            if (property == null)
            {
                return(null);
            }

            var targetType = property.PropertyType;

            object value = FilterTypeCorrector.ChangeType <TEntity>(filter.ParameterName, filter.ParameterValue);

            if (value == null)
            {
                return(null);
            }

            if (filter.ComparisonOperator == FilterComparisonOperators.Equals)
            {
                return(new EqualsSpecification <TEntity>(targetType, value, filter.ParameterName));
            }

            if (filter.ComparisonOperator == FilterComparisonOperators.GreaterThan)
            {
                return(new GreaterThanSpecification <TEntity>(targetType, value, filter.ParameterName));
            }

            if (filter.ComparisonOperator == FilterComparisonOperators.LessThan)
            {
                return(new LessThanSpecification <TEntity>(targetType, value, filter.ParameterName));
            }

            if (filter.ComparisonOperator == FilterComparisonOperators.Contains)
            {
                return(new ContainsSpecification <TEntity>(filter.ParameterValue, filter.ParameterName));
            }

            return(null);
        }
Example #3
0
        private FilterParameters ParseModel(IQueryCollection queryParameters)
        {
            var columnNames = queryParameters[FilterColumnName];
            var groups      = columnNames.GroupBy(s => s).Select(
                s => new { Name = s.Key, Count = s.Count() });

            var columns = groups.ToDictionary(arg => arg.Name, arg1 => arg1.Count);

            var filter = new FilterParameters();

            foreach (var name in columns.Keys)
            {
                var expectedCount  = columns[name];
                var valueParameter = string.Format(FilterColumnValue, name);
                var values         = new string[expectedCount];

                if (queryParameters.ContainsKey(valueParameter))
                {
                    var parameterValues = queryParameters[valueParameter];
                    values = parameterValues;
                }

                var operatorParameter   = string.Format(FilterParameterOperator, name);
                var comparisonOperators = ParseEnum(queryParameters, operatorParameter, expectedCount, FilterComparisonOperators.None);
                var logicalParameter    = string.Format(FilterParameterNext, name);
                var logicalOperators    = ParseEnum(queryParameters, logicalParameter, expectedCount, FilterLogicalOperators.None);

                for (int i = 0; i < expectedCount; i++)
                {
                    if (!string.IsNullOrWhiteSpace(values[i]) && comparisonOperators[i] != FilterComparisonOperators.None)
                    {
                        var filterStatement = new FilterStatement();
                        filterStatement.ParameterName      = name;
                        filterStatement.ParameterValue     = values[i];
                        filterStatement.ComparisonOperator = comparisonOperators[i];
                        filterStatement.LogicalOperator    = logicalOperators[i];
                        filter.Statements.Add(filterStatement);
                    }
                }
            }

            if (queryParameters.ContainsKey(PageSize))
            {
                if (int.TryParse(queryParameters[PageSize], NumberStyles.None, CultureInfo.InvariantCulture,
                                 out var res))
                {
                    filter.PageSize = res;
                }
            }

            filter.PageSize    = ParseInt(queryParameters, PageSize, -1);
            filter.CurrentPage = ParseInt(queryParameters, CurrentPage, -1);

            if (queryParameters.ContainsKey(OrderBy))
            {
                filter.OrderKind = ParseEnum(queryParameters, OrderKind, 1, Filterable.OrderKind.Asc).First();
                filter.OrderBy   = queryParameters[OrderBy];
            }

            return(filter);
        }