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

Commit bf38ba4

Browse files
committed
Add support for DELETE table joins
1 parent 31099ef commit bf38ba4

File tree

4 files changed

+61
-0
lines changed

4 files changed

+61
-0
lines changed

src/ServiceStack.OrmLite.SqlServer/SqlServerExpression.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ protected override void VisitFilter(string operand, object originalLeft, object
5353
right = "CAST({0} AS TIME)".Fmt(right);
5454
}
5555
}
56+
57+
public override string ToDeleteRowStatement()
58+
{
59+
return base.tableDefs.Count > 1
60+
? $"DELETE {DialectProvider.GetQuotedTableName(modelDef)} {FromExpression} {WhereExpression}"
61+
: base.ToDeleteRowStatement();
62+
}
5663
}
5764

5865
internal class SqlServerExpressionUtils

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,16 @@ public virtual void CopyParamsTo(IDbCommand dbCmd)
990990

991991
public virtual string ToDeleteRowStatement()
992992
{
993+
var hasTableJoin = tableDefs.Count > 1;
994+
if (hasTableJoin)
995+
{
996+
var clone = this.Clone();
997+
var pk = DialectProvider.GetQuotedColumnName(modelDef, modelDef.PrimaryKey);
998+
clone.Select(pk);
999+
var subSql = clone.ToSelectStatement();
1000+
var sql = $"DELETE FROM {DialectProvider.GetQuotedTableName(modelDef)} WHERE {pk} IN ({subSql})";
1001+
return sql;
1002+
}
9931003
return $"DELETE FROM {DialectProvider.GetQuotedTableName(modelDef)} {WhereExpression}";
9941004
}
9951005

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using NUnit.Framework;
2+
using ServiceStack.OrmLite.Tests.Shared;
3+
4+
namespace ServiceStack.OrmLite.Tests.Expression
5+
{
6+
class PersonJoin
7+
{
8+
public int Id { get; set; }
9+
public int PersonId { get; set; }
10+
}
11+
12+
[TestFixture]
13+
public class SqlExpressionDeleteTests : OrmLiteTestBase
14+
{
15+
[Test]
16+
public void Can_delete_entity_with_join_expression()
17+
{
18+
if (Dialect == Dialect.MySql) return; //Not Supported
19+
20+
using (var db = OpenDbConnection())
21+
{
22+
db.DropAndCreateTable<Person>();
23+
db.DropAndCreateTable<PersonJoin>();
24+
25+
db.Insert(new Person { Id = 1, FirstName = "Foo" });
26+
db.Insert(new PersonJoin { Id = 1, PersonId = 1 });
27+
db.Insert(new PersonJoin { Id = 2, PersonId = 1 });
28+
29+
var q = db.From<Person>()
30+
.Join<PersonJoin>((x, y) => x.Id == y.PersonId)
31+
.Where<PersonJoin>(x => x.Id == 2);
32+
33+
var record = db.Single(q);
34+
35+
Assert.That(record.Id, Is.EqualTo(1));
36+
37+
db.Delete(q);
38+
39+
Assert.That(db.Select<Person>().Count, Is.EqualTo(0));
40+
}
41+
}
42+
}
43+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@
140140
<Compile Include="Async\SqlExpressionTests.cs" />
141141
<Compile Include="Async\SqlServerProviderTestsAsync.cs" />
142142
<Compile Include="Async\UpdateAsyncTests.cs" />
143+
<Compile Include="Expression\SqlExpressionDeleteTests.cs" />
143144
<Compile Include="Expression\SqlExpressionJoinTests.cs" />
144145
<Compile Include="Issues\JoinAliasWithSchemaIssue.cs" />
145146
<Compile Include="Issues\LoadReferencesNullReferenceIssue.cs" />

0 commit comments

Comments
 (0)