diff --git a/net/DevExtreme.AspNet.Data.Tests/FilterExpressionCompilerTests.cs b/net/DevExtreme.AspNet.Data.Tests/FilterExpressionCompilerTests.cs index 6b0d51a2..b61a5a65 100644 --- a/net/DevExtreme.AspNet.Data.Tests/FilterExpressionCompilerTests.cs +++ b/net/DevExtreme.AspNet.Data.Tests/FilterExpressionCompilerTests.cs @@ -317,6 +317,32 @@ public void GuidComparison() { ); } + + [Fact] + public void EnumComparison() { + // https://github.com/DevExpress/DevExtreme.AspNet.Data/issues/164 + + Assert.Equal( + "(obj.CompareTo(Monday) > 0)", + Compile(new object[] { "this", ">", DayOfWeek.Monday }).Body.ToString() + ); + + Assert.Equal( + "(obj.Value.CompareTo(Tuesday) < 0)", + Compile(new object[] { "this", "<", DayOfWeek.Tuesday }).Body.ToString() + ); + + Assert.Equal( + "IIF((obj == null), False, (obj.Value.CompareTo(Wednesday) >= 0))", + Compile(new object[] { "this", ">=", DayOfWeek.Wednesday }, true).Body.ToString() + ); + + Assert.Equal( + "False", + Compile(new[] { "this", "<=", null }).Body.ToString() + ); + } + } } diff --git a/net/DevExtreme.AspNet.Data/FilterExpressionCompiler.cs b/net/DevExtreme.AspNet.Data/FilterExpressionCompiler.cs index 48b5cc0a..c0fec70b 100644 --- a/net/DevExtreme.AspNet.Data/FilterExpressionCompiler.cs +++ b/net/DevExtreme.AspNet.Data/FilterExpressionCompiler.cs @@ -88,8 +88,17 @@ Expression CompileBinary(ParameterExpression dataItemExpr, IList criteriaJson) { if(_stringToLower && clientValue is String) clientValue = ((string)clientValue).ToLower(); - if((accessorExpr.Type == typeof(Guid) || accessorExpr.Type == typeof(Guid?)) && IsInequality(expressionType)) - return CompileGuidComparison(accessorExpr, expressionType, clientValue); + if(IsInequality(expressionType)) { + if(accessorExpr.Type == typeof(Guid) || accessorExpr.Type == typeof(Guid?)) { + var method = typeof(Guid).GetMethod(nameof(Guid.CompareTo), new[] { typeof(Guid) }); + return CompileCompareToCall(accessorExpr, expressionType, clientValue, method); + } + + if(Utils.StripNullableType(accessorExpr.Type).IsEnum) { + var method = typeof(Enum).GetMethod(nameof(Enum.CompareTo), new[] { typeof(object) }); + return CompileCompareToCall(accessorExpr, expressionType, clientValue, method); + } + } Expression valueExpr = Expression.Constant(clientValue, accessorExpr.Type); @@ -120,7 +129,7 @@ bool IsInequality(ExpressionType type) { return type == ExpressionType.LessThan || type == ExpressionType.LessThanOrEqual || type == ExpressionType.GreaterThanOrEqual || type == ExpressionType.GreaterThan; } - Expression CompileGuidComparison(Expression accessorExpr, ExpressionType expressionType, object clientValue) { + Expression CompileCompareToCall(Expression accessorExpr, ExpressionType expressionType, object clientValue, MethodInfo compareToMethod) { if(clientValue == null) return Expression.Constant(false); @@ -128,8 +137,8 @@ Expression CompileGuidComparison(Expression accessorExpr, ExpressionType express expressionType, Expression.Call( Utils.IsNullable(accessorExpr.Type) ? Expression.Property(accessorExpr, "Value") : accessorExpr, - typeof(Guid).GetMethod(nameof(Guid.CompareTo), new[] { typeof(Guid) }), - Expression.Constant(clientValue, typeof(Guid)) + compareToMethod, + Expression.Constant(clientValue, compareToMethod.GetParameters()[0].ParameterType) ), Expression.Constant(0) );