comparison UnitTests/Linq/AssociationTest.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:f990fcb411a9
1 using System;
2 using System.Linq;
3
4 using BLToolkit.Data.DataProvider;
5 using BLToolkit.Data.Linq;
6 using BLToolkit.DataAccess;
7 using BLToolkit.Mapping;
8
9 using NUnit.Framework;
10
11 namespace Data.Linq
12 {
13 using Model;
14
15 [TestFixture]
16 public class AssociationTest : TestBase
17 {
18 [Test]
19 public void Test1()
20 {
21 ForEachProvider(db => AreEqual(
22 from ch in Child where ch.ParentID == 1 select new { ch, ch.Parent },
23 from ch in db.Child where ch.ParentID == 1 select new { ch, ch.Parent }));
24 }
25
26 [Test]
27 public void Test2()
28 {
29 var expected =
30 from p in Parent
31 from ch in p.Children
32 where ch.ParentID < 4 || ch.ParentID >= 4
33 select new { p.ParentID, ch.ChildID };
34
35 ForEachProvider(db => AreEqual(expected,
36 from p in db.Parent
37 from ch in p.Children
38 where ch.ParentID < 4 || ch.ParentID >= 4
39 select new { p.ParentID, ch.ChildID }));
40 }
41
42 [Test]
43 public void Test3()
44 {
45 var expected =
46 from p in Parent
47 from ch in p.Children
48 where p.ParentID < 4 || p.ParentID >= 4
49 select new { p.ParentID };
50
51 ForEachProvider(db => AreEqual(expected,
52 from p in db.Parent
53 from ch in p.Children
54 where p.ParentID < 4 || p.ParentID >= 4
55 select new { p.ParentID }));
56 }
57
58 [Test]
59 public void Test4()
60 {
61 var expected =
62 from p in Parent
63 from ch in p.Children
64 where p.ParentID < 4 || p.ParentID >= 4
65 select new { p.ParentID, ch.ChildID };
66
67 ForEachProvider(db => AreEqual(expected,
68 from p in db.Parent
69 from ch in p.Children
70 where p.ParentID < 4 || p.ParentID >= 4
71 select new { p.ParentID, ch.ChildID }));
72 }
73
74 [Test]
75 public void Test5()
76 {
77 var expected =
78 from p in Parent
79 from ch in p.Children2
80 where ch.ParentID < 4 || ch.ParentID >= 4
81 select new { p.ParentID, ch.ChildID };
82
83 ForEachProvider(db => AreEqual(expected,
84 from p in db.Parent
85 from ch in p.Children2
86 where ch.ParentID < 4 || ch.ParentID >= 4
87 select new { p.ParentID, ch.ChildID }));
88 }
89
90 [Test]
91 public void SelectMany1()
92 {
93 ForEachProvider(db => AreEqual(
94 Parent.SelectMany(p => p.Children.Select(ch => p)),
95 db.Parent.SelectMany(p => p.Children.Select(ch => p))));
96 }
97
98 [Test]
99 public void SelectMany2()
100 {
101 ForEachProvider(db => AreEqual(
102 Parent.SelectMany(p => Child.Select(ch => p)),
103 db.Parent.SelectMany(p => db.Child.Select(ch => p))));
104 }
105
106 [Test]
107 public void SelectMany3()
108 {
109 ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
110 Child
111 .GroupBy(ch => ch.Parent)
112 .Where(g => g.Count() > 2)
113 .SelectMany(g => g.Select(ch => ch.Parent)),
114 db.Child
115 .GroupBy(ch => ch.Parent)
116 .Where(g => g.Count() > 2)
117 .SelectMany(g => g.Select(ch => ch.Parent))));
118 }
119
120 [Test]
121 public void SelectMany4()
122 {
123 ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
124 Child
125 .GroupBy(ch => ch.Parent)
126 .Where(g => g.Count() > 2)
127 .SelectMany(g => g.Select(ch => ch.Parent.ParentID)),
128 db.Child
129 .GroupBy(ch => ch.Parent)
130 .Where(g => g.Count() > 2)
131 .SelectMany(g => g.Select(ch => ch.Parent.ParentID))));
132 }
133
134 [Test]
135 public void SelectMany5()
136 {
137 ForEachProvider(db => AreEqual(
138 Parent.SelectMany(p => p.Children.Select(ch => p.ParentID)),
139 db.Parent.SelectMany(p => p.Children.Select(ch => p.ParentID))));
140 }
141
142 [Test]
143 public void LeftJoin1()
144 {
145 ForEachProvider(db => AreEqual(
146 from p in Parent from c in p.Children.DefaultIfEmpty() where p.ParentID >= 4 select new { p, c },
147 from p in db.Parent from c in p.Children.DefaultIfEmpty() where p.ParentID >= 4 select new { p, c }));
148 }
149
150 [Test]
151 public void LeftJoin2()
152 {
153 ForEachProvider(db => AreEqual(
154 from p in Parent from c in p.Children.DefaultIfEmpty() where p.ParentID >= 4 select new { c, p },
155 from p in db.Parent from c in p.Children.DefaultIfEmpty() where p.ParentID >= 4 select new { c, p }));
156 }
157
158 [Test]
159 public void GroupBy1()
160 {
161 ForEachProvider(db => AreEqual(
162 from ch in Child group ch by ch.Parent into g select g.Key,
163 from ch in db.Child group ch by ch.Parent into g select g.Key));
164 }
165
166 [Test]
167 public void GroupBy2()
168 {
169 ForEachProvider(db => AreEqual(
170 (from ch in Child group ch by ch.Parent1).ToList().Select(g => g.Key),
171 (from ch in db.Child group ch by ch.Parent1).ToList().Select(g => g.Key)));
172 }
173
174 [Test]
175 public void GroupBy3()
176 {
177 ForEachProvider(db => AreEqual(
178 from p in Parent group p by p.Types.DateTimeValue.Year into g select g.Key,
179 from p in db.Parent group p by p.Types.DateTimeValue.Year into g select g.Key));
180 }
181
182 [Test]
183 public void GroupBy4()
184 {
185 ForEachProvider(db => AreEqual(
186 from p in Types group p by p.DateTimeValue.Year into g select g.Key,
187 from p in db.Types group p by p.DateTimeValue.Year into g select g.Key));
188 }
189
190 [Test]
191 public void EqualsNull1([IncludeDataContexts("Northwind")] string context)
192 {
193 using (var db = new NorthwindDB())
194 AreEqual(
195 from employee in Employee where employee.ReportsToEmployee != null select employee.EmployeeID,
196 from employee in db.Employee where employee.ReportsToEmployee != null select employee.EmployeeID);
197 }
198
199 [Test]
200 public void EqualsNull2([IncludeDataContexts("Northwind")] string context)
201 {
202 using (var db = new NorthwindDB())
203 AreEqual(
204 from employee in Employee where employee.ReportsToEmployee != null select employee,
205 from employee in db.Employee where employee.ReportsToEmployee != null select employee);
206 }
207
208 [Test]
209 public void EqualsNull3([IncludeDataContexts("Northwind")] string context)
210 {
211 using (var db = new NorthwindDB())
212 AreEqual(
213 from employee in Employee where employee.ReportsToEmployee != null select new { employee.ReportsToEmployee, employee },
214 from employee in db.Employee where employee.ReportsToEmployee != null select new { employee.ReportsToEmployee, employee });
215 }
216
217 [Test]
218 public void StackOverflow1([IncludeDataContexts("Northwind")] string context)
219 {
220 using (var db = new NorthwindDB())
221 Assert.AreEqual(
222 (from employee in Employee where employee.Employees.Count > 0 select employee).FirstOrDefault(),
223 (from employee in db.Employee where employee.Employees.Count > 0 select employee).FirstOrDefault());
224 }
225
226 [Test]
227 public void StackOverflow2()
228 {
229 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
230 from p in Parent5 where p.Children.Count != 0 select p,
231 from p in db.Parent5 where p.Children.Count != 0 select p));
232 }
233
234 [Test]
235 public void StackOverflow3()
236 {
237 ForEachProvider(new[] { ProviderName.SqlCe },
238 db => AreEqual(
239 from p in Parent5 where p.Children.Count() != 0 select p,
240 from p in db.Parent5 where p.Children.Count() != 0 select p));
241 }
242
243 [Test]
244 public void StackOverflow4()
245 {
246 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
247 from p in Parent5 select new { p.Children.Count },
248 from p in db.Parent5 select new { p.Children.Count }));
249 }
250
251 [Test]
252 public void DoubleJoin()
253 {
254 ForEachProvider(db => AreEqual(
255 from g in GrandChild where g.Child.Parent.Value1 == 1 select g,
256 from g in db.GrandChild where g.Child.Parent.Value1 == 1 select g));
257 }
258
259 [Test]
260 public void Projection1()
261 {
262 ForEachProvider(db => AreEqual(
263 from c in
264 from c in Child
265 where c.Parent.ParentID == 2
266 select c
267 join g in GrandChild on c.ParentID equals g.ParentID
268 where g.ChildID == 22
269 select new { c.Parent, c },
270 from c in
271 from c in db.Child
272 where c.Parent.ParentID == 2
273 select c
274 join g in db.GrandChild on c.ParentID equals g.ParentID
275 where g.ChildID == 22
276 select new { c.Parent, c }));
277 }
278
279 [TableName("Parent")]
280 public class Top
281 {
282 public int ParentID;
283 public int? Value1;
284
285 [Association(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = true)]
286 public Middle Middle { get; set; }
287 }
288
289 [TableName("Child")]
290 public class Middle
291 {
292 [PrimaryKey] public int ParentID;
293 [PrimaryKey] public int ChildID;
294
295 [Association(ThisKey = "ChildID", OtherKey = "ChildID", CanBeNull = false)]
296 public Bottom Bottom { get; set; }
297
298 [Association(ThisKey = "ChildID", OtherKey = "ChildID", CanBeNull = true)]
299 public Bottom Bottom1 { get; set; }
300 }
301
302 [TableName("GrandChild")]
303 public class Bottom
304 {
305 public int ParentID;
306 public int ChildID;
307 public int GrandChildID;
308 }
309
310 [Test]
311 public void TestTernary1([DataContexts(ProviderName.SQLite, ProviderName.Access)] string context)
312 {
313 var ids = new[] { 1, 5 };
314
315 using (var db = GetDataContext(context))
316 {
317 var q =
318 from t in db.GetTable<Top>()
319 where ids.Contains(t.ParentID)
320 orderby t.ParentID
321 select t.Middle == null ? null : t.Middle.Bottom;
322
323 var list = q.ToList();
324
325 Assert.NotNull(list[0]);
326 Assert.Null (list[1]);
327 }
328 }
329
330 [Test]
331 public void TestTernary2()
332 {
333 var ids = new[] { 1, 5 };
334
335 ForEachProvider(
336 new[] { ProviderName.SQLite, ProviderName.Access },
337 db =>
338 {
339 var q =
340 from t in db.GetTable<Top>()
341 where ids.Contains(t.ParentID)
342 orderby t.ParentID
343 select t.Middle.Bottom;
344
345 var list = q.ToList();
346
347 Assert.NotNull(list[0]);
348 Assert.Null (list[1]);
349 });
350 }
351
352 [Test]
353 public void TestTernary3()
354 {
355 var ids = new[] { 1, 5 };
356
357 ForEachProvider(db =>
358 {
359 var q =
360 from t in db.GetTable<Top>()
361 where ids.Contains(t.ParentID)
362 orderby t.ParentID
363 select t.Middle.Bottom1;
364
365 var list = q.ToList();
366
367 Assert.NotNull(list[0]);
368 Assert.Null (list[1]);
369 });
370 }
371
372 [TableName("Child")]
373 [InheritanceMapping(Code = 1, IsDefault = true, Type = typeof(ChildForHeirarhy))]
374 public class ChildBaseForHeirarhy
375 {
376 [MapField(IsInheritanceDiscriminator = true)]
377 public int ChildID { get; set; }
378 }
379
380 public class ChildForHeirarhy : ChildBaseForHeirarhy
381 {
382 public int ParentID { get; set; }
383 [Association(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = true)]
384 public Parent Parent { get; set; }
385 }
386
387 [Test]
388 public void AssociationInHeirarhy()
389 {
390 ForEachProvider(db =>
391 {
392 db.GetTable<ChildBaseForHeirarhy>()
393 .OfType<ChildForHeirarhy>()
394 .Select(ch => new ChildForHeirarhy { Parent = ch.Parent })
395 .ToList();
396 });
397 }
398
399 [Test]
400 public void LetTest1()
401 {
402 ForEachProvider(db =>
403 AreEqual(
404 from p in Parent
405 let chs = p.Children
406 select new { p.ParentID, Count = chs.Count() },
407 from p in db.Parent
408 let chs = p.Children
409 select new { p.ParentID, Count = chs.Count() }));
410 }
411
412 [Test]
413 public void LetTest2()
414 {
415 ForEachProvider(db =>
416 AreEqual(
417 from p in Parent
418 select new { p } into p
419 let chs = p.p.Children
420 select new { p.p.ParentID, Count = chs.Count() },
421 from p in db.Parent
422 select new { p } into p
423 let chs = p.p.Children
424 select new { p.p.ParentID, Count = chs.Count() }));
425 }
426 }
427 }