The following is a general solution that can be used for any type for which comparison operators are defined, not just DateTime. I applied methods, extension methods for the type Enum.ComparisionOperator. It will be used as:
Expression<Func<SomeType, bool>> somePredicate = comparisonOperator.Compare(
(SomeType p) => p.SomeDateProperty, dateTime1, dateTime2));
Methods defined as:
public static Expression<Func<TSource, bool>> Compare<TSource, TValue>(
this Enums.ComparisonOperator comparison,
Expression<Func<TSource, TValue>> source,
TValue value1, TValue value2)
{
var value1Expr = Expression.Constant(value1);
var value2Expr = Expression.Constant(value2);
var newExpr = comparison.CompareExpr(source.Body, value1Expr, value2Expr);
return Expression.Lambda<Func<TSource, bool>>(newExpr, source.Parameters);
}
public static Expression CompareExpr(
this Enums.ComparisonOperator comparison,
Expression exprLeft,
Expression exprRight1, Expression exprRight2)
{
switch (comparison)
{
case Enums.ComparisonOperator.IsLessThan:
return Expression.LessThan(exprLeft, exprRight1);
case Enums.ComparisonOperator.IsLessThanOrEqualTo:
return Expression.LessThanOrEqual(exprLeft, exprRight1);
case Enums.ComparisonOperator.IsGreaterThan:
return Expression.GreaterThan(exprLeft, exprRight1);
case Enums.ComparisonOperator.IsGreaterThanOrEqualTo:
return Expression.GreaterThanOrEqual(exprLeft, exprRight1);
case Enums.ComparisonOperator.IsBetween:
return Expression.AndAlso(
Expression.GreaterThanOrEqual(exprLeft, exprRight1),
Expression.LessThanOrEqual(exprLeft, exprRight2));
default:
return Expression.Equal(exprLeft, exprRight1);
}
}
Edit: I changed the above methods to general.
source
share