示例#1
0
        public IQueryable <T> FilterObject <T>(IQueryable <T> query, PagedRequest request) where T : class, new()
        {
            var filterObjectType = reFilterTypeMatcher.GetMatchingType <T>();
            var filterObject     = request.Where.ToObject(filterObjectType);

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

            if (filterValues.Keys.Any())
            {
                filterValues.Keys.Where(fk => !specialFilterProperties.Any(sfp => sfp.Name == fk)).ToList().ForEach(fv =>
                {
                    var selectedPfc = request.PropertyFilterConfigs?.FirstOrDefault(pfc => pfc.PropertyName == fv)
                                      ?? new PropertyFilterConfig
                    {
                        PropertyName = fv
                    };
                    selectedPfc.Value = filterValues[fv];

                    var predicate = ReFilterExpressionBuilder.ReFilterExpressionBuilder.BuildPredicate <T>(selectedPfc);
                    query         = query.Where(predicate);
                });

                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);
        }
示例#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);
        }