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

Commit 5ecad0d

Browse files
committed
Added support Concat string in SqlExpression
1 parent feb7e9b commit 5ecad0d

File tree

7 files changed

+97
-1
lines changed

7 files changed

+97
-1
lines changed

src/ServiceStack.OrmLite.Firebird/FirebirdSqlExpression.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Generic;
12
using System.Linq.Expressions;
23

34
namespace ServiceStack.OrmLite.Firebird
@@ -29,6 +30,11 @@ protected override object VisitColumnAccessMethod(MethodCallExpression m)
2930
}
3031
return new PartialSqlString(statement);
3132
}
33+
34+
protected override PartialSqlString ToConcatPartialString(List<object> args)
35+
{
36+
return new PartialSqlString(string.Join(" || ", args));
37+
}
3238
}
3339
}
3440

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
namespace ServiceStack.OrmLite.MySql
1+
using System.Collections.Generic;
2+
3+
namespace ServiceStack.OrmLite.MySql
24
{
35
public class MySqlExpression<T> : SqlExpression<T>
46
{
57
public MySqlExpression(IOrmLiteDialectProvider dialectProvider)
68
: base(dialectProvider) {}
9+
10+
protected override PartialSqlString ToConcatPartialString(List<object> args)
11+
{
12+
return new PartialSqlString(string.Format("CONCAT({0})", string.Join(", ", args)));
13+
}
714
}
815
}

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 ToConcatPartialString(List<object> args)
57+
{
58+
return new PartialSqlString(string.Join(" || ", args));
59+
}
5560
}
5661
}
5762

src/ServiceStack.OrmLite.PostgreSQL/PostgreSqlExpression.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Generic;
12
using System.Linq;
23

34
namespace ServiceStack.OrmLite.PostgreSQL
@@ -24,6 +25,11 @@ public override SqlExpression<T> OrderByRandom()
2425
{
2526
return base.OrderBy("RANDOM()");
2627
}
28+
29+
protected override PartialSqlString ToConcatPartialString(List<object> args)
30+
{
31+
return new PartialSqlString(string.Join(" || ", args));
32+
}
2733
}
2834

2935
}

src/ServiceStack.OrmLite.Sqlite/SqliteExpression.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq.Expressions;
34

45
namespace ServiceStack.OrmLite.Sqlite
@@ -76,5 +77,10 @@ public override SqlExpression<T> OrderByRandom()
7677
{
7778
return base.OrderBy("random()");
7879
}
80+
81+
protected override PartialSqlString ToConcatPartialString(List<Object> args)
82+
{
83+
;return new PartialSqlString(String.Join(" || ", args));
84+
}
7985
}
8086
}

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1339,6 +1339,9 @@ protected virtual object VisitBinary(BinaryExpression b)
13391339
else if (operand == "<>" && right.ToString().Equals("null", StringComparison.OrdinalIgnoreCase))
13401340
operand = "is not";
13411341

1342+
if (operand == "+" && b.Left.Type == typeof(string) && b.Right.Type == typeof(string))
1343+
return BuildConcatExpression(new List<object>() {left, right});
1344+
13421345
VisitFilter(operand, originalLeft, originalRight, ref left, ref right);
13431346

13441347
switch (operand)
@@ -1708,6 +1711,9 @@ protected virtual object VisitMethodCall(MethodCallExpression m)
17081711
if (IsColumnAccess(m))
17091712
return VisitColumnAccessMethod(m);
17101713

1714+
if (IsStaticStringMethod(m))
1715+
return VisitStaticStringMethodCall(m);
1716+
17111717
return CachedExpressionCompiler.Evaluate(m);
17121718
}
17131719

@@ -1963,6 +1969,44 @@ private object ToInPartialString(Expression memberExpr, object quotedColName)
19631969
return new PartialSqlString(statement);
19641970
}
19651971

1972+
private bool IsStaticStringMethod(MethodCallExpression m)
1973+
{
1974+
if (m.Object == null && m.Method.Name == "Concat")
1975+
{
1976+
return true;
1977+
}
1978+
1979+
return false;
1980+
}
1981+
1982+
protected virtual object VisitStaticStringMethodCall(MethodCallExpression m)
1983+
{
1984+
switch (m.Method.Name)
1985+
{
1986+
case "Concat":
1987+
var args = VisitExpressionList(m.Arguments);
1988+
return BuildConcatExpression(args);
1989+
1990+
default:
1991+
throw new NotSupportedException();
1992+
}
1993+
}
1994+
1995+
private PartialSqlString BuildConcatExpression(List<object> args)
1996+
{
1997+
for (int i = 0; i < args.Count; i++)
1998+
{
1999+
if (args[i] as PartialSqlString == null)
2000+
args[i] = ConvertToParam(args[i]);
2001+
}
2002+
return ToConcatPartialString(args);
2003+
}
2004+
2005+
protected virtual PartialSqlString ToConcatPartialString(List<object> args)
2006+
{
2007+
return new PartialSqlString(String.Join(" + ", args));
2008+
}
2009+
19662010
protected virtual object VisitSqlMethodCall(MethodCallExpression m)
19672011
{
19682012
List<object> args = this.VisitInSqlExpressionList(m.Arguments);

tests/ServiceStack.OrmLite.Tests/ExpressionVisitorTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,28 @@ public void Can_Where_using_filter_with_ToString()
458458
Assert.That(target.Count, Is.EqualTo(3));
459459
}
460460

461+
[Test]
462+
public void Can_Where_using_filter_with_Concat()
463+
{
464+
string filterText = "asdf";
465+
int filterInt = 10;
466+
467+
System.Linq.Expressions.Expression<Func<TestType, bool>> filter = x => String.Concat(x.TextCol, x.NullableIntCol.ToString()) == filterText + filterInt;
468+
var q = Db.From<TestType>().Where(filter);
469+
var target = Db.Select(q);
470+
Assert.That(target.Count, Is.EqualTo(1));
471+
472+
filter = x => String.Concat(x.TextCol, ".", x.NullableIntCol.ToString()) == filterText + "." + filterInt;
473+
q = Db.From<TestType>().Where(filter);
474+
target = Db.Select(q);
475+
Assert.That(target.Count, Is.EqualTo(1));
476+
477+
filter = x => x.TextCol + "." + x.NullableIntCol.ToString() == filterText + "." + filterInt;
478+
q = Db.From<TestType>().Where(filter);
479+
target = Db.Select(q);
480+
Assert.That(target.Count, Is.EqualTo(1));
481+
}
482+
461483
private int MethodReturningInt(int val)
462484
{
463485
return val;

0 commit comments

Comments
 (0)