Example #1
0
        //public List<PropertyFilterConfig> Unpack(object filterObject, PagedRequest request)
        //{
        //    var newPropertyFilterConfigs = new List<PropertyFilterConfig>();

        //    var filterValues = filterObject.GetObjectPropertiesWithValue();

        //    filterValues.Where(fv => fv.GetType().Name == typeof(RangeFilter<>).Name).ToList().ForEach(fv =>
        //    {
        //        newPropertyFilterConfigs.AddRange(UnpackRangeFilter(fv, request));
        //        else if (filterValue.GetType() is IReFilterRequest)
        //        {

        //        }
        //    });

        //    return newPropertyFilterConfigs;
        //}

        //public List<PropertyFilterConfig> UnpackRangeFilter(object filterValue, PagedRequest request)
        //{
        //    if (filterValue.GetType().Name == typeof(RangeFilter<>).Name)
        //    {
        //        var newPropertyFilterConfigs = new List<PropertyFilterConfig>();
        //        var selectedPfc = request.PropertyFilterConfigs?.FirstOrDefault(pfc => pfc.PropertyName == fv);

        //        var filterValueValues = filterValue.GetObjectPropertiesWithValue();
        //        filterValueValues.TryGetValue("Start", out object lowValue);
        //        filterValueValues.TryGetValue("End", out object highValue);

        //        if (selectedPfc.OperatorComparer is OperatorComparer.BetweenExclusive)
        //        {
        //            if (lowValue != null)
        //            {
        //                newPropertyFilterConfigs.Add(new PropertyFilterConfig
        //                {
        //                    OperatorComparer = OperatorComparer.GreaterThan,
        //                    PropertyName = selectedPfc.PropertyName,
        //                    Value = lowValue
        //                });
        //            }

        //            if (highValue != null)
        //            {
        //                newPropertyFilterConfigs.Add(new PropertyFilterConfig
        //                {
        //                    OperatorComparer = OperatorComparer.LessThan,
        //                    PropertyName = selectedPfc.PropertyName,
        //                    Value = highValue
        //                });
        //            }
        //        }

        //        if (selectedPfc.OperatorComparer is OperatorComparer.BetweenInclusive)
        //        {
        //            if (lowValue != null)
        //            {
        //                newPropertyFilterConfigs.Add(new PropertyFilterConfig
        //                {
        //                    OperatorComparer = OperatorComparer.GreaterThanOrEqual,
        //                    PropertyName = selectedPfc.PropertyName,
        //                    Value = lowValue
        //                });
        //            }

        //            if (highValue != null)
        //            {
        //                newPropertyFilterConfigs.Add(new PropertyFilterConfig
        //                {
        //                    OperatorComparer = OperatorComparer.LessThanOrEqual,
        //                    PropertyName = selectedPfc.PropertyName,
        //                    Value = highValue
        //                });
        //            }
        //        }

        //        if (selectedPfc.OperatorComparer is OperatorComparer.BetweenHigherInclusive)
        //        {
        //            if (lowValue != null)
        //            {
        //                newPropertyFilterConfigs.Add(new PropertyFilterConfig
        //                {
        //                    OperatorComparer = OperatorComparer.GreaterThan,
        //                    PropertyName = selectedPfc.PropertyName,
        //                    Value = lowValue
        //                });
        //            }

        //            if (highValue != null)
        //            {
        //                newPropertyFilterConfigs.Add(new PropertyFilterConfig
        //                {
        //                    OperatorComparer = OperatorComparer.LessThanOrEqual,
        //                    PropertyName = selectedPfc.PropertyName,
        //                    Value = highValue
        //                });
        //            }
        //        }

        //        if (selectedPfc.OperatorComparer is OperatorComparer.BetweenLowerInclusive)
        //        {
        //            if (lowValue != null)
        //            {
        //                newPropertyFilterConfigs.Add(new PropertyFilterConfig
        //                {
        //                    OperatorComparer = OperatorComparer.GreaterThanOrEqual,
        //                    PropertyName = selectedPfc.PropertyName,
        //                    Value = lowValue
        //                });
        //            }

        //            if (highValue != null)
        //            {
        //                newPropertyFilterConfigs.Add(new PropertyFilterConfig
        //                {
        //                    OperatorComparer = OperatorComparer.LessThan,
        //                    PropertyName = selectedPfc.PropertyName,
        //                    Value = highValue
        //                });
        //            }
        //        }
        //    }
        //}

        #endregion Filtering

        #region SearchQueries

        public IQueryable <T> SearchObject <T>(IQueryable <T> query, BasePagedRequest request) where T : class, new()
        {
            var objectType = query.ElementType;

            var predicate = PredicateBuilder.New(query);

            List <PropertyInfo> searchableProperties;

            if (!string.IsNullOrEmpty(request.SearchQuery))
            {
                searchableProperties = objectType.GetSearchableProperties();

                if (searchableProperties.Any())
                {
                    var expressionBuilder = new ReFilterExpressionBuilder.ReFilterExpressionBuilder();
                    foreach (var property in searchableProperties)
                    {
                        var propertyFilterConfig = expressionBuilder.BuildSearchPropertyFilterConfig(property, request.SearchQuery);
                        var searchExpressions    = expressionBuilder.BuildPredicate <T>(propertyFilterConfig);

                        searchExpressions.ForEach(searchExpression => predicate.Or(searchExpression));
                    }
                }

                return(query.Where(predicate));
            }

            return(query);
        }
Example #2
0
        public IQueryable <T> FilterObject <T>(IQueryable <T> query, PagedRequest request) where T : class, new()
        {
            var filterObjectType = reFilterTypeMatcher.GetMatchingType <T>();

            // This also works
            //var stringWhere = JsonConvert.SerializeObject(request.Where);
            //var filterObject = JsonConvert.DeserializeObject(stringWhere, filterObjectType,
            //    new JsonConverter[] {
            //        new DateOnlyConverter(),
            //        new DateOnlyNullableConverter(),
            //        new TimeOnlyConverter()
            //    });

            var filterObject = request.Where.ToObject(filterObjectType, Serializer);

            var filterValues            = filterObject.GetObjectPropertiesWithValue();
            var specialFilterProperties = filterObjectType.GetSpecialFilterProperties();

            if (filterValues.Keys.Any())
            {
                var expressionBuilder = new ReFilterExpressionBuilder.ReFilterExpressionBuilder();
                filterValues.Keys.Where(fk => !specialFilterProperties.Any(sfp => sfp.Name == fk)).ToList().ForEach(fv =>
                {
                    var filterValue = filterValues[fv];
                    if (filterValue.GetType().Name == typeof(RangeFilter <>).Name)
                    {
                        var selectedPfc = request.PropertyFilterConfigs?.FirstOrDefault(pfc => pfc.PropertyName == fv);

                        Type type      = filterValue.GetType().GetGenericArguments()[0];
                        var methodInfo = GetType().GetMethod(nameof(UnpackRangeFilter))
                                         .MakeGenericMethod(type);
                        List <PropertyFilterConfig> newPropertyFilterConfigs = (List <PropertyFilterConfig>)
                                                                               methodInfo.Invoke(this, new object[] { filterValue, selectedPfc });

                        newPropertyFilterConfigs.ForEach(npfc =>
                        {
                            var predicate = expressionBuilder.BuildPredicate <T>(npfc);
                            query         = query.Where(predicate[0]);
                        });
                    }
                    else if (filterValue.GetType() is IReFilterRequest)
                    {
                        // Recursive build here?
                    }
                    else
                    {
                        var selectedPfc = request.PropertyFilterConfigs?.FirstOrDefault(pfc => pfc.PropertyName == fv)
                                          ?? new PropertyFilterConfig
                        {
                            PropertyName = fv
                        };
                        selectedPfc.Value = filterValues[fv];
                        var predicate     = expressionBuilder.BuildPredicate <T>(selectedPfc);
                        query             = query.Where(predicate[0]);
                    }
                });

                if (filterValues.Keys.Any(fk => specialFilterProperties.Any(sfp => sfp.Name == fk)))
                {
                    var filterBuilder = reFilterTypeMatcher.GetMatchingFilterBuilder <T>();
                    query = filterBuilder.BuildFilteredQuery(query, filterObject as IReFilterRequest);
                }
            }

            return(query);
        }