Skip to content

Instantly share code, notes, and snippets.

@Grinderofl
Last active October 17, 2018 17:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Grinderofl/fe9b7f0570aab9adf18e8e394f9fe4ba to your computer and use it in GitHub Desktop.
Save Grinderofl/fe9b7f0570aab9adf18e8e394f9fe4ba to your computer and use it in GitHub Desktop.
FilterFieldExpressionFactory.cs
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;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment