using System.Collections.Generic;
using System.Linq.Expressions;
public static void Main()
HireDate = new DateTime(2017, 1, 1)
HireDate = new DateTime(2014, 12, 31)
HireDate = new DateTime(2017, 1, 1)
HireDate = new DateTime(2017, 1, 1)
foreach (var emp in employees.WhereRules(Rules)) {
Console.WriteLine("{0} - {1:d}", emp.Name, emp.HireDate);
private static Rule[] Rules = new[] {
Operation = ExpressionType.Equal,
PropertyName = "HireDate",
Operation = ExpressionType.GreaterThan,
Value = new DateTime(2016, 1, 1)
public string PropertyName { get; set; }
public ExpressionType Operation { get; set; }
public object Value { get; set; }
public string Name { get; set; }
public DateTime HireDate { get; set; }
public static class EnumerableExtensions
public static IEnumerable<T> WhereRules<T>(this IEnumerable<T> source, IEnumerable<Rule> rules)
var parameter = Expression.Parameter(typeof(T));
BinaryExpression binaryExpression = null;
foreach (var rule in rules)
var prop = Expression.Property(parameter, rule.PropertyName);
var value = Expression.Constant(rule.Value);
var newBinary = Expression.MakeBinary(rule.Operation, prop, value);
: Expression.MakeBinary(ExpressionType.AndAlso, binaryExpression, newBinary);
var cookedExpression = Expression.Lambda<Func<T, bool>>(binaryExpression, parameter).Compile();
return source.Where(cookedExpression);