@@ -188,7 +188,7 @@ private CompileResult CompileExpression(Expression expression, List<object?> que
188
188
else if ( expression . NodeType is ExpressionType . Call ) {
189
189
MethodCallExpression call = ( MethodCallExpression ) expression ;
190
190
CompileResult [ ] callArguments = new CompileResult [ call . Arguments . Count ] ;
191
- CompileResult ? callTarget = call . Object is not null ? CompileExpression ( call . Object , queryParameters ) : null ;
191
+ CompileResult callTarget = call . Object is not null ? CompileExpression ( call . Object , queryParameters ) : default ;
192
192
193
193
for ( int i = 0 ; i < callArguments . Length ; i ++ ) {
194
194
callArguments [ i ] = CompileExpression ( call . Arguments [ i ] , queryParameters ) ;
@@ -200,14 +200,30 @@ private CompileResult CompileExpression(Expression expression, List<object?> que
200
200
sqlCall = "(" + callArguments [ 0 ] . CommandText + " like " + callArguments [ 1 ] . CommandText + ")" ;
201
201
}
202
202
else if ( call . Method . Name is "Contains" && callArguments . Length == 2 ) {
203
- sqlCall = "(" + callArguments [ 1 ] . CommandText + " in " + callArguments [ 0 ] . CommandText + ")" ;
203
+ // string.Contains(string, StringComparison)
204
+ if ( call . Object ? . Type == typeof ( string ) ) {
205
+ StringComparison comparison = ( StringComparison ) callArguments [ 1 ] . Value ! ;
206
+ switch ( comparison ) {
207
+ case StringComparison . Ordinal :
208
+ case StringComparison . CurrentCulture :
209
+ sqlCall = "( instr(" + callTarget . CommandText + "," + callArguments [ 0 ] . CommandText + ") >0 )" ;
210
+ break ;
211
+ case StringComparison . OrdinalIgnoreCase :
212
+ case StringComparison . CurrentCultureIgnoreCase :
213
+ sqlCall = "(" + callTarget . CommandText + " like ( '%' || " + callArguments [ 0 ] . CommandText + " || '%'))" ;
214
+ break ;
215
+ }
216
+ }
217
+ else {
218
+ sqlCall = "(" + callArguments [ 1 ] . CommandText + " in " + callArguments [ 0 ] . CommandText + ")" ;
219
+ }
204
220
}
205
221
else if ( call . Method . Name is "Contains" && callArguments . Length == 1 ) {
206
- if ( call . Object != null && call . Object . Type == typeof ( string ) ) {
207
- sqlCall = "( instr(" + callTarget ! . Value . CommandText + "," + callArguments [ 0 ] . CommandText + ") >0 )" ;
222
+ if ( call . Object is not null && call . Object . Type == typeof ( string ) ) {
223
+ sqlCall = "( instr(" + callTarget . CommandText + "," + callArguments [ 0 ] . CommandText + ") >0 )" ;
208
224
}
209
225
else {
210
- sqlCall = "(" + callArguments [ 0 ] . CommandText + " in " + callTarget ! . Value . CommandText + ")" ;
226
+ sqlCall = "(" + callArguments [ 0 ] . CommandText + " in " + callTarget . CommandText + ")" ;
211
227
}
212
228
}
213
229
else if ( call . Method . Name is "StartsWith" && callArguments . Length >= 1 ) {
@@ -217,10 +233,10 @@ private CompileResult CompileExpression(Expression expression, List<object?> que
217
233
}
218
234
switch ( comparisonType ) {
219
235
case StringComparison . Ordinal or StringComparison . CurrentCulture :
220
- sqlCall = "( substr(" + callTarget ! . Value . CommandText + ", 1, " + callArguments [ 0 ] . Value ! . ToString ( ) ! . Length + ") = " + callArguments [ 0 ] . CommandText + ")" ;
236
+ sqlCall = "( substr(" + callTarget . CommandText + ", 1, " + callArguments [ 0 ] . Value ! . ToString ( ) ! . Length + ") = " + callArguments [ 0 ] . CommandText + ")" ;
221
237
break ;
222
238
case StringComparison . OrdinalIgnoreCase or StringComparison . CurrentCultureIgnoreCase :
223
- sqlCall = "(" + callTarget ! . Value . CommandText + " like (" + callArguments [ 0 ] . CommandText + " || '%'))" ;
239
+ sqlCall = "(" + callTarget . CommandText + " like (" + callArguments [ 0 ] . CommandText + " || '%'))" ;
224
240
break ;
225
241
}
226
242
}
@@ -231,24 +247,24 @@ private CompileResult CompileExpression(Expression expression, List<object?> que
231
247
}
232
248
switch ( comparisonType ) {
233
249
case StringComparison . Ordinal or StringComparison . CurrentCulture :
234
- sqlCall = "( substr(" + callTarget ! . Value . CommandText + ", length(" + callTarget . Value . CommandText + ") - " + callArguments [ 0 ] . Value ! . ToString ( ) ! . Length + "+1, " + callArguments [ 0 ] . Value ! . ToString ( ) ! . Length + ") = " + callArguments [ 0 ] . CommandText + ")" ;
250
+ sqlCall = "( substr(" + callTarget . CommandText + ", length(" + callTarget . CommandText + ") - " + callArguments [ 0 ] . Value ! . ToString ( ) ! . Length + "+1, " + callArguments [ 0 ] . Value ! . ToString ( ) ! . Length + ") = " + callArguments [ 0 ] . CommandText + ")" ;
235
251
break ;
236
252
case StringComparison . OrdinalIgnoreCase or StringComparison . CurrentCultureIgnoreCase :
237
- sqlCall = "(" + callTarget ! . Value . CommandText + " like ('%' || " + callArguments [ 0 ] . CommandText + "))" ;
253
+ sqlCall = "(" + callTarget . CommandText + " like ('%' || " + callArguments [ 0 ] . CommandText + "))" ;
238
254
break ;
239
255
}
240
256
}
241
257
else if ( call . Method . Name is "Equals" && callArguments . Length == 1 ) {
242
- sqlCall = "(" + callTarget ! . Value . CommandText + " = (" + callArguments [ 0 ] . CommandText + "))" ;
258
+ sqlCall = "(" + callTarget . CommandText + " = (" + callArguments [ 0 ] . CommandText + "))" ;
243
259
}
244
260
else if ( call . Method . Name is "ToLower" ) {
245
- sqlCall = "(lower(" + callTarget ! . Value . CommandText + "))" ;
261
+ sqlCall = "(lower(" + callTarget . CommandText + "))" ;
246
262
}
247
263
else if ( call . Method . Name is "ToUpper" ) {
248
- sqlCall = "(upper(" + callTarget ! . Value . CommandText + "))" ;
264
+ sqlCall = "(upper(" + callTarget . CommandText + "))" ;
249
265
}
250
266
else if ( call . Method . Name is "Replace" && callArguments . Length == 2 ) {
251
- sqlCall = "(replace(" + callTarget ! . Value . CommandText + "," + callArguments [ 0 ] . CommandText + "," + callArguments [ 1 ] . CommandText + "))" ;
267
+ sqlCall = "(replace(" + callTarget . CommandText + "," + callArguments [ 0 ] . CommandText + "," + callArguments [ 1 ] . CommandText + "))" ;
252
268
}
253
269
else if ( call . Method . Name is "IsNullOrEmpty" && callArguments . Length == 1 ) {
254
270
sqlCall = "(" + callArguments [ 0 ] . CommandText + " is null or" + callArguments [ 0 ] . CommandText + " ='' )" ;
0 commit comments