Took this slightly further (which you could definitely describe as making it worse :-)) by adding a limited form of an OrElse; namespace MyExtensions { public enum Operand { Equal, NotEqual, LessThan, LessThanEqual, GreaterThan, GreaterThanEqual } public static class Extensions { public static IQueryable<T> AddOrElse<T, V, U>( this IQueryable<T> queryable, string lhsName, Operand lhsOperand, V lhsValue, string rhsName, Operand rhsOperand, U rhsValue) { ParameterExpression pe = Expression.Parameter( typeof (T), "p" ); IQueryable<T> query = queryable.Where<T>( Expression.Lambda<Func<T, bool >>(Expression.OrElse( MakeBinaryExpression<T, V>(pe, lhsName, lhsOperand, lhsValue), MakeBinaryExpression<T, U>(pe, rhsName, rhsOperand, rhsValue)), new ParameterExpression[] { pe })); return (query); } public static IQueryable<T> AddClause<T, V>( this IQueryable<T> queryable, string propertyName, Operand operand, V propertyValue) { ParameterExpression pe...