public static Expression Build(Expression memberAccess, string stringValue, ObjectFieldFilterOperator filterType)
        {
            if (string.IsNullOrEmpty(stringValue))
            {
                if (filterType == ObjectFieldFilterOperator.Equals)
                {
                    return(Expression.Equal(memberAccess, Expression.Constant(null)));
                }
                if (filterType == ObjectFieldFilterOperator.DoesNotEqual)
                {
                    return(Expression.NotEqual(memberAccess, Expression.Constant(null)));
                }
                throw new ArgumentOutOfRangeException(nameof(filterType), filterType, null);
            }

            DateTimeParseHelper.TryParse(stringValue, out var filterValue);
            var        date     = Expression.Constant(filterValue, memberAccess.Type);
            var        nextDate = Expression.Constant(filterValue.AddDays(1), memberAccess.Type);
            var        prevDate = Expression.Constant(filterValue.AddDays(-1), memberAccess.Type);
            Expression result;

            switch (filterType)
            {
            case ObjectFieldFilterOperator.Equals:
                result = Expression.AndAlso(Expression.LessThanOrEqual(date, memberAccess), Expression.LessThan(memberAccess, nextDate));
                break;

            case ObjectFieldFilterOperator.DoesNotEqual:
                result = Expression.OrElse(Expression.LessThan(memberAccess, date), Expression.LessThanOrEqual(nextDate, memberAccess));
                break;

            case ObjectFieldFilterOperator.LessThan:
                result = Expression.LessThan(memberAccess, date);
                break;

            case ObjectFieldFilterOperator.LessThanOrEquals:
                result = Expression.LessThan(memberAccess, prevDate);
                break;

            case ObjectFieldFilterOperator.GreaterThan:
                result = Expression.GreaterThanOrEqual(memberAccess, nextDate);
                break;

            case ObjectFieldFilterOperator.GreaterThanOrEquals:
                result = Expression.GreaterThanOrEqual(memberAccess, date);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(filterType), filterType, null);
            }

            if (memberAccess.Type == typeof(DateTime?) && filterType == ObjectFieldFilterOperator.DoesNotEqual)
            {
                result = Expression.OrElse(result, Expression.Equal(memberAccess, Expression.Constant(null)));
            }
            return(result);
        }
Esempio n. 2
0
        private static BinaryExpression CreateFilterExpression(Type propertyType, ObjectFieldFilterOperator @operator, Expression leftExpression, Expression rightExpression)
        {
            if (propertyType == typeof(string))
            {
                var compareToInvocation = Expression.Call(leftExpression, typeof(string).GetMethod("CompareTo", new[] { typeof(string) }), rightExpression);
                return(makeBinaryExpressionByOperator[@operator](compareToInvocation, Expression.Constant(0, typeof(int))));
            }

            return(makeBinaryExpressionByOperator[@operator](leftExpression, rightExpression));
        }
Esempio n. 3
0
 private static BinaryExpression CreateFilterExpression(ObjectFieldFilterOperator @operator, Expression leftExpression, Expression rightExpression)
 {
     return(makeBinaryExpressionByOperator[@operator](leftExpression, rightExpression));
 }