Skip to content

Commit 5ca39b6

Browse files
authored
Fix for Nullable Enum filter (#260)
* ParseConstantExpressionToEnum * fix test * enum GetNonNullableType * 1.0.12
1 parent 5e24989 commit 5ca39b6

File tree

4 files changed

+72
-32
lines changed

4 files changed

+72
-32
lines changed

Directory.Build.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
</PropertyGroup>
55

66
<PropertyGroup>
7-
<VersionPrefix>1.0.11</VersionPrefix>
7+
<VersionPrefix>1.0.12</VersionPrefix>
88
</PropertyGroup>
99

1010
<Choose>

src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs

+10-3
Original file line numberDiff line numberDiff line change
@@ -557,12 +557,19 @@ private object ParseConstantExpressionToEnum(int pos, Type leftType, ConstantExp
557557
{
558558
try
559559
{
560-
if (constantExpr.Value is string)
560+
if (constantExpr.Value is string stringValue)
561561
{
562-
return Enum.Parse(TypeHelper.GetNonNullableType(leftType), (string)constantExpr.Value, true);
562+
return Enum.Parse(TypeHelper.GetNonNullableType(leftType), stringValue, true);
563563
}
564+
}
565+
catch
566+
{
567+
throw ParseError(pos, Res.ExpressionTypeMismatch, leftType);
568+
}
564569

565-
return Enum.ToObject(leftType, constantExpr.Value);
570+
try
571+
{
572+
return Enum.ToObject(TypeHelper.GetNonNullableType(leftType), constantExpr.Value);
566573
}
567574
catch
568575
{

test/System.Linq.Dynamic.Core.Tests/ExpressionTests.cs

+60-27
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
using System.Collections.Generic;
1+
using Newtonsoft.Json.Linq;
2+
using NFluent;
3+
using System.Collections.Generic;
24
using System.Dynamic;
35
using System.Globalization;
46
using System.Linq.Dynamic.Core.Exceptions;
57
using System.Linq.Dynamic.Core.Tests.Helpers;
68
using System.Linq.Dynamic.Core.Tests.Helpers.Models;
7-
using Newtonsoft.Json.Linq;
89
using Xunit;
9-
using NFluent;
1010

1111
namespace System.Linq.Dynamic.Core.Tests
1212
{
@@ -28,6 +28,8 @@ public class TestEnumClass
2828

2929
public TestEnum2 B { get; set; }
3030

31+
public TestEnum2? C { get; set; }
32+
3133
public int Id { get; set; }
3234
}
3335

@@ -571,9 +573,6 @@ public void ExpressionTests_DoubleQualifiers_Negative()
571573
public void ExpressionTests_Enum()
572574
{
573575
var config = new ParsingConfig();
574-
#if NETCOREAPP
575-
// config.CustomTypeProvider = new NetStandardCustomTypeProvider();
576-
#endif
577576

578577
// Arrange
579578
var lst = new List<TestEnum> { TestEnum.Var1, TestEnum.Var2, TestEnum.Var3, TestEnum.Var4, TestEnum.Var5, TestEnum.Var6 };
@@ -589,8 +588,8 @@ public void ExpressionTests_Enum()
589588
var resultEqualItLeft = qry.Where(config, "it = Var5");
590589
var resultEqualItRight = qry.Where(config, "Var5 = it");
591590

592-
var resultEqualEnumParamLeft = qry.Where(config, "@0 = it", TestEnum.Var5);
593-
var resultEqualEnumParamRight = qry.Where(config, "it = @0", TestEnum.Var5);
591+
var resultEqualEnumParamLeft = qry.Where("@0 = it", TestEnum.Var5);
592+
var resultEqualEnumParamRight = qry.Where("it = @0", TestEnum.Var5);
594593

595594
var resultEqualIntParamLeft = qry.Where("@0 = it", 8);
596595
var resultEqualIntParamRight = qry.Where("it = @0", 8);
@@ -625,12 +624,51 @@ public void ExpressionTests_Enum()
625624
}
626625

627626
[Fact]
628-
public void ExpressionTests_ConfigExtensions()
627+
public void ExpressionTests_Enum_Property()
628+
{
629+
// Arrange
630+
var qry = new List<TestEnumClass> { new TestEnumClass { B = TestEnum2.Var2 } }.AsQueryable();
631+
632+
// Act
633+
var resultEqualEnumParamLeft = qry.Where("@0 == it.B", TestEnum2.Var2).ToDynamicArray();
634+
var resultEqualEnumParamRight = qry.Where("it.B == @0", TestEnum2.Var2).ToDynamicArray();
635+
636+
var resultEqualIntParamLeft = qry.Where("@0 == it.B", 1).ToDynamicArray();
637+
var resultEqualIntParamRight = qry.Where("it.B == @0", 1).ToDynamicArray();
638+
639+
// Assert
640+
Check.That(resultEqualEnumParamLeft.Single()).Equals(TestEnum2.Var2);
641+
Check.That(resultEqualEnumParamRight.Single()).Equals(TestEnum2.Var2);
642+
643+
Check.That(resultEqualIntParamLeft.Single()).Equals(TestEnum2.Var2);
644+
Check.That(resultEqualIntParamRight.Single()).Equals(TestEnum2.Var2);
645+
}
646+
647+
[Fact]
648+
public void ExpressionTests_Enum_NullableProperty()
649+
{
650+
// Arrange
651+
var qry = new List<TestEnumClass> { new TestEnumClass { C = TestEnum2.Var2 } }.AsQueryable();
652+
653+
// Act
654+
var resultEqualEnumParamLeft = qry.Where("@0 == it.C", TestEnum2.Var2).ToDynamicArray();
655+
var resultEqualEnumParamRight = qry.Where("it.C == @0", TestEnum2.Var2).ToDynamicArray();
656+
657+
var resultEqualIntParamLeft = qry.Where("@0 == it.C", 1).ToDynamicArray();
658+
var resultEqualIntParamRight = qry.Where("it.C == @0", 1).ToDynamicArray();
659+
660+
// Assert
661+
Check.That(resultEqualEnumParamLeft.Single()).Equals(TestEnum2.Var2);
662+
Check.That(resultEqualEnumParamRight.Single()).Equals(TestEnum2.Var2);
663+
664+
Check.That(resultEqualIntParamLeft.Single()).Equals(TestEnum2.Var2);
665+
Check.That(resultEqualIntParamRight.Single()).Equals(TestEnum2.Var2);
666+
}
667+
668+
[Fact]
669+
public void ExpressionTests_Enum_MoreTests()
629670
{
630671
var config = new ParsingConfig();
631-
#if NETCOREAPP
632-
// config.CustomTypeProvider = new NetStandardCustomTypeProvider();
633-
#endif
634672

635673
// Arrange
636674
var lst = new List<TestEnum> { TestEnum.Var1, TestEnum.Var2, TestEnum.Var3, TestEnum.Var4, TestEnum.Var5, TestEnum.Var6 };
@@ -652,23 +690,18 @@ public void ExpressionTests_ConfigExtensions()
652690
[Fact]
653691
public void ExpressionTests_Enum_Nullable()
654692
{
655-
var config = new ParsingConfig();
656-
#if NETSTANDARD
657-
// config.CustomTypeProvider = new NetStandardCustomTypeProvider();
658-
#endif
659-
660693
// Act
661-
var result1a = new[] { TestEnum.Var1 }.AsQueryable().Where(config, "it = @0", (TestEnum?)TestEnum.Var1);
662-
var result1b = new[] { TestEnum.Var1 }.AsQueryable().Where(config, "@0 = it", (TestEnum?)TestEnum.Var1);
663-
var result2a = new[] { (TestEnum?)TestEnum.Var1, null }.AsQueryable().Where(config, "it = @0", TestEnum.Var1);
664-
var result2b = new[] { (TestEnum?)TestEnum.Var1, null }.AsQueryable().Where(config, "@0 = it", TestEnum.Var1);
665-
var result3a = new[] { (TestEnum?)TestEnum.Var1, null }.AsQueryable().Where(config, "it = @0", (TestEnum?)TestEnum.Var1);
666-
var result3b = new[] { (TestEnum?)TestEnum.Var1, null }.AsQueryable().Where(config, "@0 = it", (TestEnum?)TestEnum.Var1);
694+
var result1a = new[] { TestEnum.Var1 }.AsQueryable().Where("it = @0", (TestEnum?)TestEnum.Var1);
695+
var result1b = new[] { TestEnum.Var1 }.AsQueryable().Where("@0 = it", (TestEnum?)TestEnum.Var1);
696+
var result2a = new[] { (TestEnum?)TestEnum.Var1, null }.AsQueryable().Where("it = @0", TestEnum.Var1);
697+
var result2b = new[] { (TestEnum?)TestEnum.Var1, null }.AsQueryable().Where("@0 = it", TestEnum.Var1);
698+
var result3a = new[] { (TestEnum?)TestEnum.Var1, null }.AsQueryable().Where("it = @0", (TestEnum?)TestEnum.Var1);
699+
var result3b = new[] { (TestEnum?)TestEnum.Var1, null }.AsQueryable().Where("@0 = it", (TestEnum?)TestEnum.Var1);
667700

668-
var result10a = new[] { TestEnum.Var1 }.AsQueryable().Where(config, "it = @0", "Var1");
669-
var result10b = new[] { TestEnum.Var1 }.AsQueryable().Where(config, "@0 = it", "Var1");
670-
var result11a = new[] { (TestEnum?)TestEnum.Var1, null }.AsQueryable().Where(config, "it = @0", "Var1");
671-
var result11b = new[] { (TestEnum?)TestEnum.Var1, null }.AsQueryable().Where(config, "@0 = it", "Var1");
701+
var result10a = new[] { TestEnum.Var1 }.AsQueryable().Where("it = @0", "Var1");
702+
var result10b = new[] { TestEnum.Var1 }.AsQueryable().Where("@0 = it", "Var1");
703+
var result11a = new[] { (TestEnum?)TestEnum.Var1, null }.AsQueryable().Where("it = @0", "Var1");
704+
var result11b = new[] { (TestEnum?)TestEnum.Var1, null }.AsQueryable().Where("@0 = it", "Var1");
672705

673706
// Assert
674707
Assert.Equal(TestEnum.Var1, result1a.Single());

test/System.Linq.Dynamic.Core.Tests/Helpers/TestEnum.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ public enum TestEnum
1212
Var5 = 8,
1313
Var6 = 16,
1414
}
15-
}
15+
}

0 commit comments

Comments
 (0)