//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); }
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); }