private static Predicate CreateDelegate(FilterTypes filters) { //Sort predicates by heaviness Expression resultExpression = null; FilterTypes sexStatusFilter = (filters & FilterTypes.sex_status_all_types); if (sexStatusFilter != FilterTypes.empty) { resultExpression = ExpressionCache[sexStatusFilter]; } filters = filters.ResetFlags(sexStatusFilter); foreach (FilterTypes filterType in filters.EnumerateSetFlags()) { var expression = ExpressionCache[filterType]; if (resultExpression == null) { resultExpression = expression; } else { resultExpression = Expression.AndAlso(resultExpression, expression); } } return(Expression .Lambda <Predicate>(resultExpression, AccountParameter, QueryParameter) .Compile(false)); }
private static Predicate Fallback(FilterTypes filters) { if (MissesCache.TryGetValue(filters, out Predicate result)) { return(result); } result = CreateDelegate(filters); if (MissesCache.TryAdd(filters, result)) { IEnumerable <string> elements = filters.EnumerateSetFlags().Select(x => $"{nameof(FilterTypes)}.{x}"); Console.WriteLine(string.Join(" | ", elements) + ","); } return(result); }