Skip to content

Commit 1ab711b

Browse files
committed
Add Contains method with StringComparison parameter
From praeclarum/sqlite-net#806
1 parent 3df9abf commit 1ab711b

File tree

1 file changed

+29
-13
lines changed

1 file changed

+29
-13
lines changed

SQLiteSharp/TableQuery.cs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)