Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit d6e8e74

Browse files
committed
Add OrmLiteConfig.StripUpperInLike option for omitting upper(name) in Like searches
1 parent 8f5d114 commit d6e8e74

File tree

3 files changed

+82
-10
lines changed

3 files changed

+82
-10
lines changed

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,20 +1305,46 @@ protected virtual object VisitColumnAccessMethod(MethodCallExpression m)
13051305
statement = string.Format("lower({0})", quotedColName);
13061306
break;
13071307
case "StartsWith":
1308-
statement = string.Format("upper({0}) like {1} escape '\\'",
1309-
quotedColName, OrmLiteConfig.DialectProvider.GetQuotedValue(
1310-
OrmLiteConfig.DialectProvider.EscapeWildcards(args[0].ToString()).ToUpper() + "%"));
1308+
if (!OrmLiteConfig.StripUpperInLike)
1309+
{
1310+
statement = string.Format("upper({0}) like {1} escape '\\'",
1311+
quotedColName, OrmLiteConfig.DialectProvider.GetQuotedValue(
1312+
OrmLiteConfig.DialectProvider.EscapeWildcards(args[0].ToString()).ToUpper() + "%"));
1313+
}
1314+
else
1315+
{
1316+
statement = string.Format("{0} like {1} escape '\\'",
1317+
quotedColName, OrmLiteConfig.DialectProvider.GetQuotedValue(
1318+
OrmLiteConfig.DialectProvider.EscapeWildcards(args[0].ToString()) + "%"));
1319+
}
13111320
break;
13121321
case "EndsWith":
1313-
statement = string.Format("upper({0}) like {1} escape '\\'",
1314-
quotedColName, OrmLiteConfig.DialectProvider.GetQuotedValue("%" +
1315-
OrmLiteConfig.DialectProvider.EscapeWildcards(args[0].ToString()).ToUpper()));
1322+
if (!OrmLiteConfig.StripUpperInLike)
1323+
{
1324+
statement = string.Format("upper({0}) like {1} escape '\\'",
1325+
quotedColName, OrmLiteConfig.DialectProvider.GetQuotedValue("%" +
1326+
OrmLiteConfig.DialectProvider.EscapeWildcards(args[0].ToString()).ToUpper()));
1327+
}
1328+
else
1329+
{
1330+
statement = string.Format("{0} like {1} escape '\\'",
1331+
quotedColName, OrmLiteConfig.DialectProvider.GetQuotedValue("%" +
1332+
OrmLiteConfig.DialectProvider.EscapeWildcards(args[0].ToString())));
1333+
}
13161334
break;
13171335
case "Contains":
1318-
statement = string.Format("upper({0}) like {1} escape '\\'",
1319-
quotedColName, OrmLiteConfig.DialectProvider.GetQuotedValue("%" +
1320-
OrmLiteConfig.DialectProvider.EscapeWildcards(args[0].ToString()).ToUpper()
1321-
+ "%"));
1336+
if (!OrmLiteConfig.StripUpperInLike)
1337+
{
1338+
statement = string.Format("upper({0}) like {1} escape '\\'",
1339+
quotedColName, OrmLiteConfig.DialectProvider.GetQuotedValue("%" +
1340+
OrmLiteConfig.DialectProvider.EscapeWildcards(args[0].ToString()).ToUpper() + "%"));
1341+
}
1342+
else
1343+
{
1344+
statement = string.Format("{0} like {1} escape '\\'",
1345+
quotedColName, OrmLiteConfig.DialectProvider.GetQuotedValue("%" +
1346+
OrmLiteConfig.DialectProvider.EscapeWildcards(args[0].ToString()) + "%"));
1347+
}
13221348
break;
13231349
case "Substring":
13241350
var startIndex = Int32.Parse(args[0].ToString()) + 1;

src/ServiceStack.OrmLite/OrmLiteConfig.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ public static IDbConnection ToDbConnection(this string dbConnectionStringOrFileP
9898
return dbConn;
9999
}
100100

101+
public static bool StripUpperInLike { get; set; }
102+
101103
public static IOrmLiteExecFilter ExecFilter = new OrmLiteExecFilter();
102104

103105
public static Action<IDbCommand, object> InsertFilter { get; set; }

tests/ServiceStack.OrmLite.Tests/Expression/SelectExpressionTests.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,50 @@ public void Can_escape_wildcards()
167167
Assert.That(db.Count<Poco>(q => q.Name.StartsWith(@"a\b")), Is.EqualTo(2));
168168
}
169169
}
170+
171+
[Test]
172+
public void Can_perform_case_sensitive_likes()
173+
{
174+
using (var db = OpenDbConnection())
175+
{
176+
db.DropAndCreateTable<Poco>();
177+
178+
db.Insert(new Poco { Name = "Apple" });
179+
db.Insert(new Poco { Name = "ABCDE" });
180+
db.Insert(new Poco { Name = "abc" });
181+
182+
Func<string> normalizedSql = () =>
183+
db.GetLastSql().Replace("\"", "").Replace("`", "").Replace("Name", "name");
184+
185+
db.Count<Poco>(q => q.Name.StartsWith("A"));
186+
Assert.That(normalizedSql(),
187+
Is.StringContaining("WHERE upper(name) like 'A%'"));
188+
189+
db.Count<Poco>(q => q.Name.EndsWith("e"));
190+
Assert.That(normalizedSql(),
191+
Is.StringContaining("WHERE upper(name) like '%E'"));
192+
193+
db.Count<Poco>(q => q.Name.Contains("b"));
194+
Assert.That(normalizedSql(),
195+
Is.StringContaining("WHERE upper(name) like '%B%'"));
196+
197+
OrmLiteConfig.StripUpperInLike = true;
198+
199+
db.Count<Poco>(q => q.Name.StartsWith("A"));
200+
Assert.That(normalizedSql(),
201+
Is.StringContaining("WHERE name like 'A%'"));
202+
203+
db.Count<Poco>(q => q.Name.EndsWith("e"));
204+
Assert.That(normalizedSql(),
205+
Is.StringContaining("WHERE name like '%e'"));
206+
207+
db.Count<Poco>(q => q.Name.Contains("b"));
208+
Assert.That(normalizedSql(),
209+
Is.StringContaining("WHERE name like '%b%'"));
210+
211+
OrmLiteConfig.StripUpperInLike = false;
212+
}
213+
}
170214
}
171215

172216
public class Submission

0 commit comments

Comments
 (0)