@@ -188,7 +188,7 @@ private CompileResult CompileExpression(Expression expression, List<object?> que
188188 else if ( expression . NodeType is ExpressionType . Call ) {
189189 MethodCallExpression call = ( MethodCallExpression ) expression ;
190190 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 ;
192192
193193 for ( int i = 0 ; i < callArguments . Length ; i ++ ) {
194194 callArguments [ i ] = CompileExpression ( call . Arguments [ i ] , queryParameters ) ;
@@ -200,14 +200,30 @@ private CompileResult CompileExpression(Expression expression, List<object?> que
200200 sqlCall = "(" + callArguments [ 0 ] . CommandText + " like " + callArguments [ 1 ] . CommandText + ")" ;
201201 }
202202 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+ }
204220 }
205221 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 )" ;
208224 }
209225 else {
210- sqlCall = "(" + callArguments [ 0 ] . CommandText + " in " + callTarget ! . Value . CommandText + ")" ;
226+ sqlCall = "(" + callArguments [ 0 ] . CommandText + " in " + callTarget . CommandText + ")" ;
211227 }
212228 }
213229 else if ( call . Method . Name is "StartsWith" && callArguments . Length >= 1 ) {
@@ -217,10 +233,10 @@ private CompileResult CompileExpression(Expression expression, List<object?> que
217233 }
218234 switch ( comparisonType ) {
219235 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 + ")" ;
221237 break ;
222238 case StringComparison . OrdinalIgnoreCase or StringComparison . CurrentCultureIgnoreCase :
223- sqlCall = "(" + callTarget ! . Value . CommandText + " like (" + callArguments [ 0 ] . CommandText + " || '%'))" ;
239+ sqlCall = "(" + callTarget . CommandText + " like (" + callArguments [ 0 ] . CommandText + " || '%'))" ;
224240 break ;
225241 }
226242 }
@@ -231,24 +247,24 @@ private CompileResult CompileExpression(Expression expression, List<object?> que
231247 }
232248 switch ( comparisonType ) {
233249 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 + ")" ;
235251 break ;
236252 case StringComparison . OrdinalIgnoreCase or StringComparison . CurrentCultureIgnoreCase :
237- sqlCall = "(" + callTarget ! . Value . CommandText + " like ('%' || " + callArguments [ 0 ] . CommandText + "))" ;
253+ sqlCall = "(" + callTarget . CommandText + " like ('%' || " + callArguments [ 0 ] . CommandText + "))" ;
238254 break ;
239255 }
240256 }
241257 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 + "))" ;
243259 }
244260 else if ( call . Method . Name is "ToLower" ) {
245- sqlCall = "(lower(" + callTarget ! . Value . CommandText + "))" ;
261+ sqlCall = "(lower(" + callTarget . CommandText + "))" ;
246262 }
247263 else if ( call . Method . Name is "ToUpper" ) {
248- sqlCall = "(upper(" + callTarget ! . Value . CommandText + "))" ;
264+ sqlCall = "(upper(" + callTarget . CommandText + "))" ;
249265 }
250266 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 + "))" ;
252268 }
253269 else if ( call . Method . Name is "IsNullOrEmpty" && callArguments . Length == 1 ) {
254270 sqlCall = "(" + callArguments [ 0 ] . CommandText + " is null or" + callArguments [ 0 ] . CommandText + " ='' )" ;
0 commit comments