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

Commit a74f018

Browse files
committed
Add SqlFilter to typed SqlExpressions
1 parent 0c12e07 commit a74f018

File tree

3 files changed

+64
-7
lines changed

3 files changed

+64
-7
lines changed

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public abstract partial class SqlExpression<T> : ISqlExpression, IHasUntypedSqlE
4343
public bool WhereStatementWithoutWhereString { get; set; }
4444
public IOrmLiteDialectProvider DialectProvider { get; set; }
4545
public List<IDbDataParameter> Params { get; set; }
46+
public Func<string,string> SqlFilter { get; set; }
4647

4748
protected string Sep => sep;
4849

@@ -84,6 +85,7 @@ protected virtual SqlExpression<T> CopyTo(SqlExpression<T> to)
8485
to.PrefixFieldWithTableName = PrefixFieldWithTableName;
8586
to.WhereStatementWithoutWhereString = WhereStatementWithoutWhereString;
8687
to.Params = new List<IDbDataParameter>(Params);
88+
to.SqlFilter = SqlFilter;
8789
return to;
8890
}
8991

@@ -939,6 +941,12 @@ public virtual SqlExpression<T> Insert()
939941
return this;
940942
}
941943

944+
public virtual SqlExpression<T> WithSqlFilter(Func<string,string> sqlFilter)
945+
{
946+
this.SqlFilter = sqlFilter;
947+
return this;
948+
}
949+
942950
public string SqlTable(ModelDefinition modelDef)
943951
{
944952
return DialectProvider.GetQuotedTableName(modelDef);
@@ -988,17 +996,24 @@ public virtual void CopyParamsTo(IDbCommand dbCmd)
988996

989997
public virtual string ToDeleteRowStatement()
990998
{
999+
string sql;
9911000
var hasTableJoin = tableDefs.Count > 1;
9921001
if (hasTableJoin)
9931002
{
9941003
var clone = this.Clone();
9951004
var pk = DialectProvider.GetQuotedColumnName(modelDef, modelDef.PrimaryKey);
9961005
clone.Select(pk);
9971006
var subSql = clone.ToSelectStatement();
998-
var sql = $"DELETE FROM {DialectProvider.GetQuotedTableName(modelDef)} WHERE {pk} IN ({subSql})";
999-
return sql;
1007+
sql = $"DELETE FROM {DialectProvider.GetQuotedTableName(modelDef)} WHERE {pk} IN ({subSql})";
1008+
}
1009+
else
1010+
{
1011+
sql = $"DELETE FROM {DialectProvider.GetQuotedTableName(modelDef)} {WhereExpression}";
10001012
}
1001-
return $"DELETE FROM {DialectProvider.GetQuotedTableName(modelDef)} {WhereExpression}";
1013+
1014+
return SqlFilter != null
1015+
? SqlFilter(sql)
1016+
: sql;
10021017
}
10031018

10041019
public virtual void PrepareUpdateStatement(IDbCommand dbCmd, T item, bool excludeDefaults = false)
@@ -1031,21 +1046,31 @@ public virtual void PrepareUpdateStatement(IDbCommand dbCmd, T item, bool exclud
10311046
if (setFields.Length == 0)
10321047
throw new ArgumentException("No non-null or non-default values were provided for type: " + typeof(T).Name);
10331048

1034-
dbCmd.CommandText = $"UPDATE {DialectProvider.GetQuotedTableName(modelDef)} " +
1035-
$"SET {StringBuilderCache.ReturnAndFree(setFields)} {WhereExpression}";
1049+
var sql = $"UPDATE {DialectProvider.GetQuotedTableName(modelDef)} " +
1050+
$"SET {StringBuilderCache.ReturnAndFree(setFields)} {WhereExpression}";
1051+
1052+
dbCmd.CommandText = SqlFilter != null
1053+
? SqlFilter(sql)
1054+
: sql;
10361055
}
10371056

10381057
public virtual string ToSelectStatement()
10391058
{
10401059
var sql = DialectProvider
10411060
.ToSelectStatement(modelDef, SelectExpression, BodyExpression, OrderByExpression, Offset, Rows);
10421061

1043-
return sql;
1062+
return SqlFilter != null
1063+
? SqlFilter(sql)
1064+
: sql;
10441065
}
10451066

10461067
public virtual string ToCountStatement()
10471068
{
1048-
return "SELECT COUNT(*)" + BodyExpression;
1069+
var sql = "SELECT COUNT(*)" + BodyExpression;
1070+
1071+
return SqlFilter != null
1072+
? SqlFilter(sql)
1073+
: sql;
10491074
}
10501075

10511076
public string SelectExpression
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using NUnit.Framework;
2+
using ServiceStack.OrmLite.Tests.Shared;
3+
using ServiceStack.Text;
4+
5+
namespace ServiceStack.OrmLite.Tests.Expression
6+
{
7+
public class SqlExpressionFilterTests : OrmLiteTestBase
8+
{
9+
[Test]
10+
public void Can_enhance_SqlExpression_with_Custom_SqlFilter()
11+
{
12+
if (Dialect != Dialect.SqlServer) return;
13+
14+
using (var db = OpenDbConnection())
15+
{
16+
db.DropAndCreateTable<Person>();
17+
18+
db.InsertAll(Person.Rockstars);
19+
20+
var q = db.From<Person>()
21+
.Where(x => x.Age == 27)
22+
.WithSqlFilter(sql => sql + "\noption (recompile)");
23+
24+
var rockstars = db.Select(q);
25+
Assert.That(rockstars.Count, Is.EqualTo(4));
26+
27+
Assert.That(db.GetLastSql(), Does.Contain("option (recompile)"));
28+
}
29+
}
30+
}
31+
}

tests/ServiceStack.OrmLite.Tests/ServiceStack.OrmLite.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@
139139
<Compile Include="Expression\JoinAliasTests.cs" />
140140
<Compile Include="Expression\RestrictionTests.cs" />
141141
<Compile Include="Expression\SqlExpressionDeleteTests.cs" />
142+
<Compile Include="Expression\SqlExpressionFilterTests.cs" />
142143
<Compile Include="Expression\SqlExpressionJoinTests.cs" />
143144
<Compile Include="Issues\JoinAliasWithSchemaIssue.cs" />
144145
<Compile Include="Issues\JsonUpdateOnlyIssue.cs" />

0 commit comments

Comments
 (0)