0
|
1 using System;
|
|
2 using System.Linq;
|
|
3
|
|
4 using BLToolkit.Data.DataProvider;
|
|
5 using BLToolkit.Data.Linq;
|
|
6
|
|
7 using NUnit.Framework;
|
|
8
|
|
9 using Data.Linq;
|
|
10 using Data.Linq.Model;
|
|
11
|
|
12 #region ReSharper disable
|
|
13 // ReSharper disable ConvertToConstant.Local
|
|
14 // ReSharper disable CheckNamespace
|
|
15 #endregion
|
|
16
|
|
17 namespace Update
|
|
18 {
|
|
19 [TestFixture]
|
|
20 public class DeleteTest : TestBase
|
|
21 {
|
|
22 [Test]
|
|
23 public void Delete1()
|
|
24 {
|
|
25 ForEachProvider(db =>
|
|
26 {
|
|
27 var parent = new Parent1 { ParentID = 1001, Value1 = 1001 };
|
|
28
|
|
29 db.Delete(parent);
|
|
30
|
|
31 try
|
|
32 {
|
|
33 db.Insert(parent);
|
|
34
|
|
35 Assert.AreEqual(1, db.Parent.Count (p => p.ParentID == parent.ParentID));
|
|
36 Assert.AreEqual(1, db.Parent.Delete(p => p.ParentID == parent.ParentID));
|
|
37 Assert.AreEqual(0, db.Parent.Count (p => p.ParentID == parent.ParentID));
|
|
38 }
|
|
39 finally
|
|
40 {
|
|
41 db.Delete(parent);
|
|
42 }
|
|
43 });
|
|
44 }
|
|
45
|
|
46 [Test]
|
|
47 public void Delete2()
|
|
48 {
|
|
49 ForEachProvider(db =>
|
|
50 {
|
|
51 var parent = new Parent1 { ParentID = 1001, Value1 = 1001 };
|
|
52
|
|
53 db.Delete(parent);
|
|
54
|
|
55 try
|
|
56 {
|
|
57 db.Insert(parent);
|
|
58
|
|
59 Assert.AreEqual(1, db.Parent.Count(p => p.ParentID == parent.ParentID));
|
|
60 Assert.AreEqual(1, db.Parent.Where(p => p.ParentID == parent.ParentID).Delete());
|
|
61 Assert.AreEqual(0, db.Parent.Count(p => p.ParentID == parent.ParentID));
|
|
62 }
|
|
63 finally
|
|
64 {
|
|
65 db.Delete(parent);
|
|
66 }
|
|
67 });
|
|
68 }
|
|
69
|
|
70 [Test]
|
|
71 public void Delete3()
|
|
72 {
|
|
73 ForEachProvider(new[] { ProviderName.Informix }, db =>
|
|
74 {
|
|
75 db.Child.Delete(c => new[] { 1001, 1002 }.Contains(c.ChildID));
|
|
76
|
|
77 try
|
|
78 {
|
|
79 db.Child.Insert(() => new Child { ParentID = 1, ChildID = 1001 });
|
|
80 db.Child.Insert(() => new Child { ParentID = 1, ChildID = 1002 });
|
|
81
|
|
82 Assert.AreEqual(3, db.Child.Count(c => c.ParentID == 1));
|
|
83 Assert.AreEqual(2, db.Child.Where(c => c.Parent.ParentID == 1 && new[] { 1001, 1002 }.Contains(c.ChildID)).Delete());
|
|
84 Assert.AreEqual(1, db.Child.Count(c => c.ParentID == 1));
|
|
85 }
|
|
86 finally
|
|
87 {
|
|
88 db.Child.Delete(c => new[] { 1001, 1002 }.Contains(c.ChildID));
|
|
89 }
|
|
90 });
|
|
91 }
|
|
92
|
|
93 [Test]
|
|
94 public void Delete4()
|
|
95 {
|
|
96 ForEachProvider(new[] { ProviderName.Informix }, db =>
|
|
97 {
|
|
98 db.GrandChild1.Delete(gc => new[] { 1001, 1002 }.Contains(gc.GrandChildID.Value));
|
|
99
|
|
100 try
|
|
101 {
|
|
102 db.GrandChild.Insert(() => new GrandChild { ParentID = 1, ChildID = 1, GrandChildID = 1001 });
|
|
103 db.GrandChild.Insert(() => new GrandChild { ParentID = 1, ChildID = 2, GrandChildID = 1002 });
|
|
104
|
|
105 Assert.AreEqual(3, db.GrandChild1.Count(gc => gc.ParentID == 1));
|
|
106 Assert.AreEqual(2, db.GrandChild1.Where(gc => gc.Parent.ParentID == 1 && new[] { 1001, 1002 }.Contains(gc.GrandChildID.Value)).Delete());
|
|
107 Assert.AreEqual(1, db.GrandChild1.Count(gc => gc.ParentID == 1));
|
|
108 }
|
|
109 finally
|
|
110 {
|
|
111 db.GrandChild1.Delete(gc => new[] { 1001, 1002 }.Contains(gc.GrandChildID.Value));
|
|
112 }
|
|
113 });
|
|
114 }
|
|
115
|
|
116 [Test]
|
|
117 public void Delete5()
|
|
118 {
|
|
119 ForEachProvider(db =>
|
|
120 {
|
|
121 var values = new[] { 1001, 1002 };
|
|
122
|
|
123 db.Parent.Delete(_ => _.ParentID > 1000);
|
|
124
|
|
125 try
|
|
126 {
|
|
127 db.Parent.Insert(() => new Parent { ParentID = values[0], Value1 = 1 });
|
|
128 db.Parent.Insert(() => new Parent { ParentID = values[1], Value1 = 1 });
|
|
129
|
|
130 Assert.AreEqual(2, db.Parent.Count(_ => _.ParentID > 1000));
|
|
131 Assert.AreEqual(2, db.Parent.Delete(_ => values.Contains(_.ParentID)));
|
|
132 Assert.AreEqual(0, db.Parent.Count(_ => _.ParentID > 1000));
|
|
133 }
|
|
134 finally
|
|
135 {
|
|
136 db.Parent.Delete(_ => _.ParentID > 1000);
|
|
137 }
|
|
138 });
|
|
139 }
|
|
140
|
|
141 [Test]
|
|
142 public void AlterDelete([DataContexts(ProviderName.Informix, ExcludeLinqService=true)] string context)
|
|
143 {
|
|
144 using (var db = GetDataContext(context))
|
|
145 {
|
|
146 var q =
|
|
147 from p in db.Parent
|
|
148 join ch in db.Child on p.ParentID equals ch.ParentID into lj1
|
|
149 from ch in lj1.DefaultIfEmpty()
|
|
150 where ch != null && ch.ParentID == -1 || ch == null && p.ParentID == -1
|
|
151 select p;
|
|
152
|
|
153 q.Delete();
|
|
154
|
|
155 var sql = ((TestDbManager)db).LastQuery;
|
|
156
|
|
157 if (sql.Contains("EXISTS"))
|
|
158 Assert.That(sql.IndexOf("(("), Is.GreaterThan(0));
|
|
159 }
|
|
160 }
|
|
161
|
|
162 [Test]
|
|
163 public void DeleteMany1([DataContexts(
|
|
164 ProviderName.Access, ProviderName.DB2, ProviderName.Informix, "Oracle",
|
|
165 ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Firebird
|
|
166 )] string context)
|
|
167 {
|
|
168 using (var db = GetDataContext(context))
|
|
169 {
|
|
170 db.Parent.Insert(() => new Parent { ParentID = 1001 });
|
|
171 db.Child. Insert(() => new Child { ParentID = 1001, ChildID = 1 });
|
|
172 db.Child. Insert(() => new Child { ParentID = 1001, ChildID = 2 });
|
|
173
|
|
174 try
|
|
175 {
|
|
176 var q =
|
|
177 from p in db.Parent
|
|
178 where p.ParentID >= 1000
|
|
179 select p;
|
|
180
|
|
181 var n = q.SelectMany(p => p.Children).Delete();
|
|
182
|
|
183 Assert.That(n, Is.GreaterThanOrEqualTo(2));
|
|
184 }
|
|
185 finally
|
|
186 {
|
|
187 db.Child. Delete(c => c.ParentID >= 1000);
|
|
188 db.Parent.Delete(c => c.ParentID >= 1000);
|
|
189 }
|
|
190 }
|
|
191 }
|
|
192
|
|
193 [Test]
|
|
194 public void DeleteMany2([DataContexts(
|
|
195 ProviderName.Access, ProviderName.DB2, ProviderName.Informix, "Oracle",
|
|
196 ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Firebird
|
|
197 )] string context)
|
|
198 {
|
|
199 using (var db = GetDataContext(context))
|
|
200 {
|
|
201 db.Parent. Insert(() => new Parent { ParentID = 1001 });
|
|
202 db.Child. Insert(() => new Child { ParentID = 1001, ChildID = 1 });
|
|
203 db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 1});
|
|
204 db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 2});
|
|
205 db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 3});
|
|
206 db.Child. Insert(() => new Child { ParentID = 1001, ChildID = 2 });
|
|
207 db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 2, GrandChildID = 1});
|
|
208 db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 2, GrandChildID = 2});
|
|
209 db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 2, GrandChildID = 3});
|
|
210
|
|
211 try
|
|
212 {
|
|
213 var q =
|
|
214 from p in db.Parent
|
|
215 where p.ParentID >= 1000
|
|
216 select p;
|
|
217
|
|
218 var n1 = q.SelectMany(p => p.Children.SelectMany(c => c.GrandChildren)).Delete();
|
|
219 var n2 = q.SelectMany(p => p.Children). Delete();
|
|
220
|
|
221 Assert.That(n1, Is.EqualTo(6));
|
|
222 Assert.That(n2, Is.EqualTo(2));
|
|
223 }
|
|
224 finally
|
|
225 {
|
|
226 db.GrandChild.Delete(c => c.ParentID >= 1000);
|
|
227 db.Child. Delete(c => c.ParentID >= 1000);
|
|
228 db.Parent. Delete(c => c.ParentID >= 1000);
|
|
229 }
|
|
230 }
|
|
231 }
|
|
232
|
|
233 [Test]
|
|
234 public void DeleteMany3([DataContexts(
|
|
235 ProviderName.Access, ProviderName.DB2, ProviderName.Informix, "Oracle",
|
|
236 ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Firebird
|
|
237 )] string context)
|
|
238 {
|
|
239 var ids = new[] { 1001 };
|
|
240
|
|
241 using (var db = GetDataContext(context))
|
|
242 {
|
|
243 db.GrandChild.Delete(c => c.ParentID >= 1000);
|
|
244 db.Child. Delete(c => c.ParentID >= 1000);
|
|
245 db.Parent. Delete(c => c.ParentID >= 1000);
|
|
246
|
|
247 db.Parent. Insert(() => new Parent { ParentID = 1001 });
|
|
248 db.Child. Insert(() => new Child { ParentID = 1001, ChildID = 1 });
|
|
249 db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 1});
|
|
250 db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 2});
|
|
251
|
|
252 try
|
|
253 {
|
|
254 var q =
|
|
255 from p in db.Parent
|
|
256 where ids.Contains(p.ParentID)
|
|
257 select p;
|
|
258
|
|
259 var n1 = q.SelectMany(p => p.Children).SelectMany(gc => gc.GrandChildren).Delete();
|
|
260
|
|
261 Assert.That(n1, Is.EqualTo(2));
|
|
262 }
|
|
263 finally
|
|
264 {
|
|
265 db.GrandChild.Delete(c => c.ParentID >= 1000);
|
|
266 db.Child. Delete(c => c.ParentID >= 1000);
|
|
267 db.Parent. Delete(c => c.ParentID >= 1000);
|
|
268 }
|
|
269 }
|
|
270 }
|
|
271 }
|
|
272 }
|