-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathBulkDeleteOperation.cs
107 lines (86 loc) · 3 KB
/
BulkDeleteOperation.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Copyright (C) 2019-2020 Xtensive LLC.
// This code is distributed under MIT license terms.
// See the License.txt file in the project root for more information.
using Xtensive.Orm.Linq;
using Xtensive.Orm.Providers;
using Xtensive.Orm.Services;
using Xtensive.Sql;
using Xtensive.Sql.Dml;
namespace Xtensive.Orm.BulkOperations
{
internal class BulkDeleteOperation<T> : QueryOperation<T>
where T : class, IEntity
{
#region Non-public methods
protected override int ExecuteInternal()
{
if (PrimaryIndexes.Length > 1) {
throw new NotImplementedException("Inheritance is not implemented");
}
_ = base.ExecuteInternal();
var request = GetRequest(query);
Bindings = request.ParameterBindings.ToList();
using var command = CreateCommand(request);
return command.ExecuteNonQuery();
}
protected async override Task<int> ExecuteInternalAsync(CancellationToken token = default)
{
if (PrimaryIndexes.Length > 1) {
throw new NotImplementedException("Inheritance is not implemented");
}
_ = base.ExecuteInternal();
var request = GetRequest(query);
Bindings = request.ParameterBindings.ToList();
var command = CreateCommand(request);
await using (command.ConfigureAwait(false)) {
return await command.ExecuteNonQueryAsync(token).ConfigureAwait(false);
}
}
private QueryCommand CreateCommand(in QueryTranslationResult request)
{
var delete = SqlDml.Delete(SqlDml.TableRef(PrimaryIndexes[0].Table));
Join(delete, request.Query);
return ToCommand(delete);
}
protected override SqlTableRef GetStatementTable(SqlStatement statement)
{
var delete = (SqlDelete) statement;
return delete.Delete;
}
protected override SqlExpression GetStatementWhere(SqlStatement statement)
{
var delete = (SqlDelete) statement;
return delete.Where;
}
protected override void SetStatementFrom(SqlStatement statement, SqlTable from)
{
var delete = (SqlDelete) statement;
delete.From = from;
}
protected override void SetStatementTable(SqlStatement statement, SqlTableRef table)
{
var delete = (SqlDelete) statement;
delete.Delete = table;
}
protected override void SetStatementWhere(SqlStatement statement, SqlExpression @where)
{
var delete = (SqlDelete) statement;
delete.Where = where;
}
protected override void SetStatementLimit(SqlStatement statement, SqlExpression limit)
{
var delete = (SqlDelete) statement;
delete.Limit = limit;
}
protected override bool SupportsJoin() =>
DomainHandler.Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteFrom);
protected override bool SupportsLimitation() =>
DomainHandler.Domain.StorageProviderInfo.Supports(ProviderFeatures.DeleteLimit);
#endregion
public BulkDeleteOperation(IQueryable<T> query)
: base((QueryProvider) query.Provider)
{
this.query = query;
}
}
}