Skip to content

Commit c22848a

Browse files
committed
Partial fixed ExpressionParser when WrappedValue-string is used for in-operator and left operand is enum (zzzprojects#668)
1 parent f92558e commit c22848a

File tree

2 files changed

+179
-2
lines changed

2 files changed

+179
-2
lines changed

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

+9-2
Original file line numberDiff line numberDiff line change
@@ -313,9 +313,16 @@ private Expression ParseIn()
313313
Expression right = ParseUnary();
314314

315315
// if the identifier is an Enum, try to convert the right-side also to an Enum.
316-
if (left.Type.GetTypeInfo().IsEnum && right is ConstantExpression constantExpression)
316+
if (left.Type.GetTypeInfo().IsEnum)
317317
{
318-
right = ParseEnumToConstantExpression(op.Pos, left.Type, constantExpression);
318+
if (right is ConstantExpression constantExprRight)
319+
{
320+
right = ParseEnumToConstantExpression(op.Pos, left.Type, constantExprRight);
321+
}
322+
else if (_expressionHelper.TryUnwrapAsExpression<string>(right, out var unwrappedConstantExprRight))
323+
{
324+
right = ParseEnumToConstantExpression(op.Pos, left.Type, unwrappedConstantExprRight);
325+
}
319326
}
320327

321328
// else, check for direct type match

test/System.Linq.Dynamic.Core.Tests/QueryableTests.UseParameterizedNamesInDynamicQuery .cs

+170
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,176 @@ public void When_UseParameterizedNamesInDynamicQuery_IsTrue_WrappedStringValueEn
9797
// Assert
9898
result.Should().HaveCount(1);
9999
}
100+
101+
[Fact]
102+
public void When_UseParameterizedNamesInDynamicQuery_IsTrue_WrappedStringValueEnumAsParameter_Should_Be_Unwrapped()
103+
{
104+
// Arrange
105+
var list = new List<Customer>
106+
{
107+
new()
108+
{
109+
Name = "Duffy",
110+
GenderType = Gender.Female
111+
},
112+
new()
113+
{
114+
Name = "Garry",
115+
GenderType = Gender.Male
116+
}
117+
};
118+
119+
var config = new ParsingConfig
120+
{
121+
UseParameterizedNamesInDynamicQuery = true
122+
};
123+
124+
// Act
125+
var result = list.AsQueryable().Where(config, "GenderType = @0", "Female").ToArray();
126+
127+
// Assert
128+
result.Should().HaveCount(1);
129+
}
130+
131+
[Fact]
132+
public void When_UseParameterizedNamesInDynamicQuery_IsTrue_WrappedStringValueEnumArray_Should_Be_Unwrapped()
133+
{
134+
// Arrange
135+
var list = new List<Customer>
136+
{
137+
new()
138+
{
139+
Name = "Duffy",
140+
GenderType = Gender.Female
141+
},
142+
new()
143+
{
144+
Name = "Garry",
145+
GenderType = Gender.Male
146+
},
147+
new()
148+
{
149+
Name = "Garry",
150+
GenderType = Gender.Other
151+
},
152+
new()
153+
{
154+
Name = "Garry",
155+
GenderType = Gender.Male
156+
}
157+
};
158+
159+
var config = new ParsingConfig
160+
{
161+
UseParameterizedNamesInDynamicQuery = true
162+
};
163+
164+
// Act
165+
var result = list.AsQueryable().Where(config, "GenderType in (\"Female\", \"Other\")").ToArray();
166+
167+
// Assert
168+
result.Should().HaveCount(2);
169+
}
170+
171+
[Fact]
172+
public void When_UseParameterizedNamesInDynamicQuery_IsTrue_WrappedIntergerValueEnumArray_Should_Be_Unwrapped()
173+
{
174+
// Arrange
175+
var list = new List<Customer>
176+
{
177+
new()
178+
{
179+
Name = "Duffy",
180+
GenderType = Gender.Female
181+
},
182+
new()
183+
{
184+
Name = "Garry",
185+
GenderType = Gender.Male
186+
},
187+
new()
188+
{
189+
Name = "Garry",
190+
GenderType = Gender.Other
191+
},
192+
new()
193+
{
194+
Name = "Garry",
195+
GenderType = Gender.Male
196+
}
197+
};
198+
199+
var config = new ParsingConfig
200+
{
201+
UseParameterizedNamesInDynamicQuery = true
202+
};
203+
204+
// Act
205+
var result = list.AsQueryable().Where(config, "GenderType in (0, 2)").ToArray();
206+
207+
// Assert
208+
result.Should().HaveCount(2);
209+
}
210+
211+
[Fact]
212+
public void When_UseParameterizedNamesInDynamicQuery_IsTrue_WrappedIntegerValueEnum_Should_Be_Unwrapped()
213+
{
214+
// Arrange
215+
var list = new List<Customer>
216+
{
217+
new()
218+
{
219+
Name = "Duffy",
220+
GenderType = Gender.Female
221+
},
222+
new()
223+
{
224+
Name = "Garry",
225+
GenderType = Gender.Male
226+
}
227+
};
228+
229+
var config = new ParsingConfig
230+
{
231+
UseParameterizedNamesInDynamicQuery = true
232+
};
233+
234+
// Act
235+
var result = list.AsQueryable().Where(config, "GenderType = 1").ToArray();
236+
237+
// Assert
238+
result.Should().HaveCount(1);
239+
}
240+
241+
[Fact]
242+
public void When_UseParameterizedNamesInDynamicQuery_IsTrue_WrappedIntegerStringValueEnumAsParameter_Should_Be_Unwrapped()
243+
{
244+
// Arrange
245+
var list = new List<Customer>
246+
{
247+
new()
248+
{
249+
Name = "Duffy",
250+
GenderType = Gender.Female
251+
},
252+
new()
253+
{
254+
Name = "Garry",
255+
GenderType = Gender.Male
256+
}
257+
};
258+
259+
var config = new ParsingConfig
260+
{
261+
UseParameterizedNamesInDynamicQuery = true
262+
};
263+
264+
// Act
265+
var result = list.AsQueryable().Where(config, "GenderType = @0", 1).ToArray();
266+
267+
// Assert
268+
result.Should().HaveCount(1);
269+
}
100270
}
101271

102272
public class Customer

0 commit comments

Comments
 (0)