using System.Collections.Generic;
using System.Linq.Expressions;
public static void Main()
var people = GetPeople();
ConsolePeople(GetPeopleFiltered(GetFilter(new FilterRequest
), people.AsQueryable()));
ConsolePeople(GetPeopleFiltered(GetFilter(new FilterRequest
), people.AsQueryable()));
ConsolePeople(GetPeopleFiltered(GetFilter(new FilterRequest
Male = true, TwentyToThirty = true
), people.AsQueryable()));
ConsolePeople(GetPeopleFiltered(GetFilter(new FilterRequest
Male = true, Female = true, TwentyToThirty = true, ThirtyToFourty = true, TentoTwenty = true
), people.AsQueryable()));
public static void ConsolePeople(List<Person> people)
Console.WriteLine("No people found");
foreach (var person in people)
Console.WriteLine(string.Format("FirstName: {0}, LastName: {1}, Age: {2}, Gender: {3}", person.FirstName, person.LastName, person.Age, person.Gender.ToString()));
Console.WriteLine(string.Empty);
public static List<Person> GetPeople()
var people = new List<Person>();
FirstName = "Philip", LastName = "Smith", Age = 29, Gender = GenderEnum.Male
FirstName = "Joe", LastName = "Blogs", Age = 40, Gender = GenderEnum.Male
FirstName = "Mary", LastName = "Ann", Age = 10, Gender = GenderEnum.Female
FirstName = "Lisa", LastName = "Dunn", Age = 60, Gender = GenderEnum.Male
FirstName = "Terry", LastName = "Banks", Age = 89, Gender = GenderEnum.Male
FirstName = "John", LastName = "Doe", Age = 32, Gender = GenderEnum.Male
FirstName = "Sally", LastName = "Shields", Age = 19, Gender = GenderEnum.Female
public static Expression<Func<Person, bool>> GetFilter(FilterRequest request)
var filtersOne = new List<Expression<Func<Person, bool>>>();
var filtersTwo = new List<Expression<Func<Person, bool>>>();
filtersOne.Add(x => x.Gender == GenderEnum.Male);
filtersOne.Add(x => x.Gender == GenderEnum.Female);
filtersTwo.Add(x => x.Age >= 10 && x.Age < 20);
if (request.TwentyToThirty)
filtersTwo.Add(x => x.Age >= 20 && x.Age < 30);
if (request.ThirtyToFourty)
filtersTwo.Add(x => x.Age >= 30 && x.Age < 40);
filtersTwo.Add(x => x.Age >= 40);
var genderFilter = PredicateBuilder.False<Person>();
foreach (var filter in filtersOne)
genderFilter = genderFilter.Or(filter);
var ageFilter = PredicateBuilder.False<Person>();
foreach (var filter in filtersTwo)
ageFilter = ageFilter.Or(filter);
var returnFilter = PredicateBuilder.True<Person>();
if (genderFilter != null && filtersOne.Count > 0)
returnFilter = returnFilter.And(genderFilter);
if (ageFilter != null && filtersTwo.Count > 0)
returnFilter = returnFilter.And(ageFilter);
public static List<Person> GetPeopleFiltered(Expression<Func<Person, bool>> filter, IQueryable<Person> people)
from p in people.Where(filter)select p;
public class FilterRequest
public bool TwentyToThirty
public bool ThirtyToFourty
public static class PredicateBuilder
public static Expression<Func<T, bool>> True<T>()
public static Expression<Func<T, bool>> False<T>()
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>(Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);