Skip to content

Commit 783b387

Browse files
committed
fix: parsing arrays of enums failing
1 parent f9ec13d commit 783b387

2 files changed

Lines changed: 34 additions & 3 deletions

File tree

QueryKit.UnitTests/FilterParserTests.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ public void test_in_operator()
208208
var input = """(Age ^^ [20, 30, 40]) && (BirthMonth ^^ ["January", "February", "March"]) || (Id ^^ ["6d623e92-d2cf-4496-a2df-f49fa77328ee"])""";
209209
var filterExpression = FilterParser.ParseFilter<TestingPerson>(input);
210210
filterExpression.ToString().Should()
211-
.Be(""""x => ((value(System.Collections.Generic.List`1[System.Nullable`1[System.Int32]]).Contains(x.Age) AndAlso value(System.Collections.Generic.List`1[System.String]).Contains(x.BirthMonth)) OrElse value(System.Collections.Generic.List`1[System.Guid]).Contains(x.Id))"""");
211+
.Be(""""x => ((value(System.Collections.Generic.List`1[System.Nullable`1[System.Int32]]).Contains(x.Age) AndAlso value(System.Collections.Generic.List`1[System.Nullable`1[QueryKit.WebApiTestProject.Entities.BirthMonthEnum]]).Contains(x.BirthMonth)) OrElse value(System.Collections.Generic.List`1[System.Guid]).Contains(x.Id))"""");
212212
}
213213

214214
[Fact]
@@ -217,7 +217,16 @@ public void simple_in_operator_for_string()
217217
var input = """BirthMonth ^^ ["January", "February", "March"]""";
218218
var filterExpression = FilterParser.ParseFilter<TestingPerson>(input);
219219
filterExpression.ToString().Should()
220-
.Be(""""x => value(System.Collections.Generic.List`1[System.String]).Contains(x.BirthMonth)"""");
220+
.Be(""""x => value(System.Collections.Generic.List`1[System.Nullable`1[QueryKit.WebApiTestProject.Entities.BirthMonthEnum]]).Contains(x.BirthMonth)"""");
221+
}
222+
223+
[Fact]
224+
public void simple_in_operator_for_enum_code()
225+
{
226+
var input = """BirthMonth ^^ [1, 2, 3]""";
227+
var filterExpression = FilterParser.ParseFilter<TestingPerson>(input);
228+
filterExpression.ToString().Should()
229+
.Be(""""x => value(System.Collections.Generic.List`1[System.Nullable`1[QueryKit.WebApiTestProject.Entities.BirthMonthEnum]]).Contains(x.BirthMonth)"""");
221230
}
222231

223232
[Fact]

QueryKit/FilterParser.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11

22
namespace QueryKit;
33

4-
using System.Collections;
54
using System.Globalization;
5+
using System.Linq;
66
using System.Linq.Expressions;
77
using System.Reflection;
88
using Configuration;
@@ -314,6 +314,28 @@ private static Expression CreateRightExprFromType(Type leftExprType, string righ
314314
return Expression.Constant(null, rawType);
315315
}
316316

317+
if (right.StartsWith("[") && right.EndsWith("]"))
318+
{
319+
var values = right.Trim('[', ']').Split(',').Select(x => x.Trim()).ToList();
320+
var elementType = targetType.IsArray ? targetType.GetElementType() : targetType;
321+
322+
var expressions = values.Select<string, Expression>(x =>
323+
{
324+
if (elementType == typeof(string) && x.StartsWith("\"") && x.EndsWith("\""))
325+
{
326+
x = x.Trim('"');
327+
}
328+
329+
var enumValue = Enum.Parse(enumType, x);
330+
var constant = Expression.Constant(enumValue, enumType);
331+
332+
return constant;
333+
}).ToArray();
334+
335+
var newArrayExpression = Expression.NewArrayInit(enumType, expressions);
336+
return newArrayExpression;
337+
}
338+
317339
var enumValue = Enum.Parse(enumType, right);
318340
var constant = Expression.Constant(enumValue, enumType);
319341

0 commit comments

Comments
 (0)