Skip to content

Commit c3b15dc

Browse files
committed
Set EnableConstantParameterization as false will make enum filter fail.
#202
1 parent 25216c2 commit c3b15dc

2 files changed

Lines changed: 29 additions & 6 deletions

File tree

OData/src/System.Web.OData/OData/Query/Expressions/FilterBinder.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1416,12 +1416,6 @@ private static Expression ConvertToEnumUnderlyingType(Expression expression, Typ
14161416
parameterizedConstantValue, enumUnderlyingType, CultureInfo.InvariantCulture));
14171417
}
14181418
}
1419-
else if (expression.NodeType == ExpressionType.Constant)
1420-
{
1421-
// only null constants are not parameterized.
1422-
Contract.Assert((expression as ConstantExpression).Value == null);
1423-
return expression;
1424-
}
14251419
else if (expression.Type == enumType)
14261420
{
14271421
return Expression.Convert(expression, enumUnderlyingType);
@@ -1430,6 +1424,10 @@ private static Expression ConvertToEnumUnderlyingType(Expression expression, Typ
14301424
{
14311425
return Expression.Convert(expression, typeof(Nullable<>).MakeGenericType(enumUnderlyingType));
14321426
}
1427+
else if (expression.NodeType == ExpressionType.Constant && ((ConstantExpression)expression).Value == null)
1428+
{
1429+
return expression;
1430+
}
14331431
else
14341432
{
14351433
throw Error.NotSupported(SRResources.ConvertToEnumFailed, enumType, expression.Type);

OData/test/System.Web.OData.Test/OData/Query/FilterQueryOptionTest.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,31 @@ public void ApplyToEnums_ReturnsCorrectQueryable(string filter, int[] enumModelI
661661
actualCustomers.Select(enumModel => enumModel.Id));
662662
}
663663

664+
[Theory]
665+
[PropertyData("EnumModelTestFilters")]
666+
public void ApplyToEnums_ReturnsCorrectQueryabl_IfEnableConstantParameterizationSetFalse(string filter, int[] enumModelIds)
667+
{
668+
// Arrange
669+
var model = GetEnumModel();
670+
var context = new ODataQueryContext(model, typeof(EnumModel));
671+
var filterOption = new FilterQueryOption(filter, context);
672+
IEnumerable<EnumModel> enumModels = EnumModelTestData;
673+
674+
// Act
675+
IQueryable queryable = filterOption.ApplyTo(enumModels.AsQueryable(),
676+
new ODataQuerySettings
677+
{
678+
HandleNullPropagation = HandleNullPropagationOption.True,
679+
EnableConstantParameterization = false
680+
});
681+
682+
// Assert
683+
Assert.NotNull(queryable);
684+
IEnumerable<EnumModel> actualCustomers = Assert.IsAssignableFrom<IEnumerable<EnumModel>>(queryable);
685+
Assert.Equal(
686+
enumModelIds,
687+
actualCustomers.Select(enumModel => enumModel.Id));
688+
}
664689
[Theory]
665690
[InlineData("Simple has null", typeof(ODataException))]
666691
[InlineData("null has Microsoft.TestCommon.Types.SimpleEnum'First'", typeof(ODataException))]

0 commit comments

Comments
 (0)