1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| private static Filter GetValidFilter(Filter filter) { if (string.IsNullOrEmpty(filter.Field)) throw new ArgumentException("The field attribute is required when declaring a filter"); if (string.IsNullOrEmpty(filter.Operator)) throw new ArgumentException("The Operator attribute is required when declaring a filter"); return filter; }
private static Expression CreateFilterExpression( string logic, IEnumerable<Filter> filters, ParameterExpression parameter) { Expression filterExpression = default!;
foreach (var filter in filters) { Expression bExpresionFilter;
if (!string.IsNullOrEmpty(filter.Logic)) { if (filter.Filters is null) throw new ArgumentException("The Filters attribute is required when declaring a logic"); bExpresionFilter = CreateFilterExpression(filter.Logic, filter.Filters, parameter); } else { var filterValid = GetValidFilter(filter); bExpresionFilter = CreateFilterExpression(filterValid.Field!, filterValid.Operator!, filterValid.Value, parameter); }
filterExpression = filterExpression is null ? bExpresionFilter : CombineFilter(logic, filterExpression, bExpresionFilter); }
return filterExpression; }
private static Expression CreateFilterExpression( string field, string filterOperator, object? value, ParameterExpression parameter) { var propertyExpresion = GetPropertyExpression(field, parameter); var valueExpresion = GeValuetExpression(field, value, propertyExpresion.Type); return CreateFilterExpression(propertyExpresion, valueExpresion, filterOperator); }
private static Expression CreateFilterExpression( MemberExpression memberExpression, ConstantExpression constantExpression, string filterOperator) { return filterOperator switch { FilterOperator.EQ => Expression.Equal(memberExpression, constantExpression), FilterOperator.NEQ => Expression.NotEqual(memberExpression, constantExpression), FilterOperator.LT => Expression.LessThan(memberExpression, constantExpression), FilterOperator.LTE => Expression.LessThanOrEqual(memberExpression, constantExpression), FilterOperator.GT => Expression.GreaterThan(memberExpression, constantExpression), FilterOperator.GTE => Expression.GreaterThanOrEqual(memberExpression, constantExpression), FilterOperator.CONTAINS => Expression.Call(memberExpression, FilterOperator.CONTAINS, null, constantExpression), FilterOperator.STARTSWITH => Expression.Call(memberExpression, FilterOperator.STARTSWITH, null, constantExpression), FilterOperator.ENDSWITH => Expression.Call(memberExpression, FilterOperator.ENDSWITH, null, constantExpression), _ => throw new ArgumentException("Filter Operator is not valid."), }; }
|