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