Skip to content

Instantly share code, notes, and snippets.

@Grinderofl
Last active October 17, 2018 17:41
Show Gist options
  • Select an option

  • Save Grinderofl/fe9b7f0570aab9adf18e8e394f9fe4ba to your computer and use it in GitHub Desktop.

Select an option

Save Grinderofl/fe9b7f0570aab9adf18e8e394f9fe4ba to your computer and use it in GitHub Desktop.

Revisions

  1. Grinderofl revised this gist Oct 17, 2018. 1 changed file with 0 additions and 8 deletions.
    8 changes: 0 additions & 8 deletions CriteriaType.cs
    Original file line number Diff line number Diff line change
    @@ -1,8 +0,0 @@
    public enum CriteriaType
    {
    [Display(Name = "Is")]
    Is,

    [Display(Name = "Is Not")]
    IsNot
    }
  2. Grinderofl revised this gist Oct 17, 2018. 1 changed file with 8 additions and 0 deletions.
    8 changes: 8 additions & 0 deletions CriteriaType.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,8 @@
    public enum CriteriaType
    {
    [Display(Name = "Is")]
    Is,

    [Display(Name = "Is Not")]
    IsNot
    }
  3. Grinderofl created this gist Oct 17, 2018.
    55 changes: 55 additions & 0 deletions FilterFieldExpressionFactory.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,55 @@
    public static class FilterFieldExpressionFactory
    {
    public static Expression<Func<T, bool>> Create<T>(IEnumerable<FieldResult> filterFields) where T : class =>
    FilterExpressionFactory<T>.Create(filterFields);

    private static class FilterExpressionFactory<T> where T : class
    {
    private static Expression<Func<T, bool>> CreateFieldValue(FieldResult field, FieldValue fieldValue, ExpressionStarter<T> fieldPredicate) =>
    field.CriteriaType == CriteriaType.Is
    ? CriteriaIs(field, fieldValue, fieldPredicate)
    : CriteriaIsNot(field, fieldValue, fieldPredicate);

    private static Expression<Func<T, bool>> CreateCompositeFieldValue(FieldResult field, CompositeFieldValue compositeValue, ExpressionStarter<T> fieldPredicate)
    {
    foreach (var value in compositeValue.Values)
    fieldPredicate = CreateFieldValue(field, value, fieldPredicate);

    return fieldPredicate;
    }

    private static Expression<Func<T, bool>> CriteriaIs(FieldResult field, FieldValue fieldValue, ExpressionStarter<T> fieldPredicate)
    {
    var expression = ExpressionFactory.True<T>(field.FieldName, fieldValue.Value);
    return FilterPredicate.Create(FilterType.Or, fieldPredicate, expression);
    }

    private static Expression<Func<T, bool>> CriteriaIsNot(FieldResult field, FieldValue fieldValue, ExpressionStarter<T> fieldPredicate)
    {
    var expression = ExpressionFactory.False<T>(field.FieldName, fieldValue.Value);
    return FilterPredicate.Create(FilterType.And, fieldPredicate, expression);
    }

    private static Expression<Func<T, bool>> CreateExpression(FieldResult field, FieldValue value, ExpressionStarter<T> fieldPredicate)
    {
    return value is CompositeFieldValue composite
    ? CreateCompositeFieldValue(field, composite, fieldPredicate)
    : CreateFieldValue(field, value, fieldPredicate);
    }

    public static Expression<Func<T, bool>> Create(IEnumerable<FieldResult> filterFields)
    {
    var predicate = PredicateBuilder.New<T>(true);
    foreach (var field in filterFields)
    {
    var fieldPredicate = PredicateBuilder.New<T>(true);
    foreach (var value in field.Filter.FieldValues.Where(x => x.Filter))
    fieldPredicate = CreateExpression(field, value, fieldPredicate);

    predicate = FilterPredicate.Create(FilterType.And, predicate, fieldPredicate);
    }

    return predicate;
    }
    }
    }