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

Commit 383b25d

Browse files
OlegNadymovmythz
authored andcommitted
Add support for using the Length property of String (#617)
* Support for Conditional expression in filter * Fixes for conditional expressions in filter and sorting * Using GetFieldValue in InsertOnly just like in Insert. * Change SqliteBoolConverter DbType to Int32 * Unit test for SqliteBoolConverter, InsertOnly * Fix for parsing static method inside non-static method. * Just formatting * Change access modifier to public for method "IsSqlClass" * Add support for using the Length property of String
1 parent 454ef31 commit 383b25d

File tree

6 files changed

+60
-0
lines changed

6 files changed

+60
-0
lines changed

src/ServiceStack.OrmLite.Oracle/OracleSqlExpression.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ public override SqlExpression<T> OrderByRandom()
5252
{
5353
return base.OrderBy("dbms_random.value");
5454
}
55+
56+
protected override PartialSqlString ToLengthPartialString(object arg)
57+
{
58+
return new PartialSqlString($"LENGTH({arg})");
59+
}
5560
}
5661
}
5762

src/ServiceStack.OrmLite.SqlServer/SqlServerExpression.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ public override SqlExpression<T> OrderByRandom()
2929
return base.OrderBy("NEWID()");
3030
}
3131

32+
protected override PartialSqlString ToLengthPartialString(object arg)
33+
{
34+
return new PartialSqlString($"LEN({arg})");
35+
}
36+
3237
protected override void ConvertToPlaceholderAndParameter(ref object right)
3338
{
3439
var paramName = Params.Count.ToString();

src/ServiceStack.OrmLite.Sqlite/SqliteExpression.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,5 +76,10 @@ public override SqlExpression<T> OrderByRandom()
7676
{
7777
return base.OrderBy("random()");
7878
}
79+
80+
protected override PartialSqlString ToLengthPartialString(object arg)
81+
{
82+
return new PartialSqlString($"LENGTH({arg})");
83+
}
7984
}
8085
}

src/ServiceStack.OrmLite.VistaDB/VistaDBExpression.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,10 @@ public override string GetSubstringSql(object quotedColumn, int startIndex, int?
6666
? $"substring({quotedColumn}, {startIndex}, {length.Value})"
6767
: $"substring({quotedColumn}, {startIndex}, LEN({quotedColumn}) - {startIndex} + 1)";
6868
}
69+
70+
protected override PartialSqlString ToLengthPartialString(object arg)
71+
{
72+
return new PartialSqlString($"LEN({arg})");
73+
}
6974
}
7075
}

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1815,6 +1815,12 @@ protected virtual object VisitMemberAccess(MemberExpression m)
18151815
throw new ArgumentException($"Expression '{m}' accesses unsupported property '{m.Member}' of Nullable<T>");
18161816
}
18171817

1818+
if (m.Member.DeclaringType == typeof(string) &&
1819+
m.Member.Name == nameof(string.Length))
1820+
{
1821+
return VisitLengthStringProperty(m);
1822+
}
1823+
18181824
if (IsParameterOrConvertAccess(m))
18191825
return GetMemberExpression(m);
18201826
}
@@ -2462,6 +2468,18 @@ protected virtual object VisitStaticStringMethodCall(MethodCallExpression m)
24622468
}
24632469
}
24642470

2471+
private object VisitLengthStringProperty(MemberExpression m)
2472+
{
2473+
var sql = Visit(m.Expression);
2474+
2475+
return ToLengthPartialString(sql);
2476+
}
2477+
2478+
protected virtual PartialSqlString ToLengthPartialString(object arg)
2479+
{
2480+
return new PartialSqlString($"CHAR_LENGTH({arg})");
2481+
}
2482+
24652483
private PartialSqlString BuildConcatExpression(List<object> args)
24662484
{
24672485
for (int i = 0; i < args.Count; i++)

tests/ServiceStack.OrmLite.Tests/ExpressionVisitorTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,28 @@ public void Can_Where_using_StaticInsideNonStaticMethod()
874874
Assert.AreEqual("asdf", text);
875875
}
876876

877+
[Test]
878+
public void Can_Where_using_StringLengthProperty1()
879+
{
880+
System.Linq.Expressions.Expression<Func<TestType, bool>> filter = x => x.TextCol.Length == 4;
881+
var q = Db.From<TestType>().Where(filter).OrderBy(x => x.Id);
882+
883+
var target = Db.Select(q);
884+
Assert.That(target.Count, Is.EqualTo(2));
885+
var text = target[0].TextCol;
886+
Assert.AreEqual("asdf", text);
887+
}
888+
889+
[Test]
890+
public void Can_Where_using_StringLengthProperty2()
891+
{
892+
System.Linq.Expressions.Expression<Func<TestType, bool>> filter = x => x.TextCol.Length == 0;
893+
var q = Db.From<TestType>().Where(filter).OrderBy(x => x.Id);
894+
895+
var target = Db.Select(q);
896+
Assert.That(target.Count, Is.EqualTo(0));
897+
}
898+
877899
private int MethodReturningInt(int val)
878900
{
879901
return val;

0 commit comments

Comments
 (0)