Skip to content

Commit

Permalink
fix enums could not be cast to decimal (#576)
Browse files Browse the repository at this point in the history
* fix enums could not be cast to decimal

* add test for enums and decimal/double
  • Loading branch information
jogibear9988 committed Mar 2, 2022
1 parent ad1e97c commit e9ea307
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/System.Linq.Dynamic.Core/Parser/ExpressionPromoter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,11 @@ public virtual Expression Promote(Expression expr, Type type, bool exact, bool c

if (TypeHelper.IsCompatibleWith(expr.Type, type))
{
if (type.GetTypeInfo().IsValueType || exact || expr.Type.GetTypeInfo().IsValueType && convertExpr)
if (type == typeof(decimal) && expr.Type.IsEnum)
{
return Expression.Convert(Expression.Convert(expr, Enum.GetUnderlyingType(expr.Type)), type);
}
else if (type.GetTypeInfo().IsValueType || exact || expr.Type.GetTypeInfo().IsValueType && convertExpr)
{
return Expression.Convert(expr, type);
}
Expand Down
12 changes: 12 additions & 0 deletions test/System.Linq.Dynamic.Core.Tests/ExpressionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -681,12 +681,24 @@ public void ExpressionTests_Enum_Property_Equality_Using_Argument()
var resultEqualIntParamLeft = qry.Where("@0 == it.B", 1).ToDynamicArray();
var resultEqualIntParamRight = qry.Where("it.B == @0", 1).ToDynamicArray();

var resultEqualDecimalParamLeft = qry.Where("@0 == it.B", 1m).ToDynamicArray();
var resultEqualDecimalParamRight = qry.Where("it.B == @0", 1m).ToDynamicArray();

var resultEqualDoubleParamLeft = qry.Where("@0 == it.B", 1.0).ToDynamicArray();
var resultEqualDoubleParamRight = qry.Where("it.B == @0", 1.0).ToDynamicArray();

// Assert
Check.That(resultEqualEnumParamLeft.Single()).Equals(TestEnum2.Var2);
Check.That(resultEqualEnumParamRight.Single()).Equals(TestEnum2.Var2);

Check.That(resultEqualIntParamLeft.Single()).Equals(TestEnum2.Var2);
Check.That(resultEqualIntParamRight.Single()).Equals(TestEnum2.Var2);

Check.That(resultEqualDecimalParamLeft.Single()).Equals(TestEnum2.Var2);
Check.That(resultEqualDecimalParamRight.Single()).Equals(TestEnum2.Var2);

Check.That(resultEqualDoubleParamLeft.Single()).Equals(TestEnum2.Var2);
Check.That(resultEqualDoubleParamRight.Single()).Equals(TestEnum2.Var2);
}

[Fact]
Expand Down

0 comments on commit e9ea307

Please sign in to comment.