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); }
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)); }
private static BinaryExpression CreateFilterExpression(ObjectFieldFilterOperator @operator, Expression leftExpression, Expression rightExpression) { return(makeBinaryExpressionByOperator[@operator](leftExpression, rightExpression)); }