Mercurial > pub > bltoolkit
comparison UnitTests/Linq/JoinTest.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 JoinTest : TestBase | |
17 { | |
18 [Test] | |
19 public void InnerJoin1() | |
20 { | |
21 TestJohn(db => | |
22 from p1 in db.Person | |
23 join p2 in db.Person on p1.ID equals p2.ID | |
24 where p1.ID == 1 | |
25 select new Person { ID = p1.ID, FirstName = p2.FirstName }); | |
26 } | |
27 | |
28 [Test] | |
29 public void InnerJoin2() | |
30 { | |
31 TestJohn(db => | |
32 from p1 in db.Person | |
33 join p2 in db.Person on new { p1.ID, p1.FirstName } equals new { p2.ID, p2.FirstName } | |
34 where p1.ID == 1 | |
35 select new Person { ID = p1.ID, FirstName = p2.FirstName }); | |
36 } | |
37 | |
38 [Test] | |
39 public void InnerJoin3() | |
40 { | |
41 TestJohn(db => | |
42 from p1 in db.Person | |
43 join p2 in | |
44 from p2 in db.Person join p3 in db.Person on new { p2.ID, p2.LastName } equals new { p3.ID, p3.LastName } select new { p2, p3 } | |
45 on new { p1.ID, p1.FirstName } equals new { p2.p2.ID, p2.p2.FirstName } | |
46 where p1.ID == 1 | |
47 select new Person { ID = p1.ID, FirstName = p2.p2.FirstName, LastName = p2.p3.LastName }); | |
48 } | |
49 | |
50 [Test] | |
51 public void InnerJoin4() | |
52 { | |
53 TestJohn(db => | |
54 from p1 in db.Person | |
55 join p2 in db.Person on new { p1.ID, p1.FirstName } equals new { p2.ID, p2.FirstName } | |
56 join p3 in db.Person on new { p2.ID, p2.LastName } equals new { p3.ID, p3.LastName } | |
57 where p1.ID == 1 | |
58 select new Person { ID = p1.ID, FirstName = p2.FirstName, LastName = p3.LastName }); | |
59 } | |
60 | |
61 [Test] | |
62 public void InnerJoin5() | |
63 { | |
64 TestJohn(db => | |
65 from p1 in db.Person | |
66 join p2 in db.Person on new { p1.ID, p1.FirstName } equals new { p2.ID, p2.FirstName } | |
67 join p3 in db.Person on new { p1.ID, p2.LastName } equals new { p3.ID, p3.LastName } | |
68 where p1.ID == 1 | |
69 select new Person { ID = p1.ID, FirstName = p2.FirstName, LastName = p3.LastName }); | |
70 } | |
71 | |
72 [Test] | |
73 public void InnerJoin6() | |
74 { | |
75 TestJohn(db => | |
76 from p1 in db.Person | |
77 join p2 in from p3 in db.Person select new { ID = p3.ID + 1, p3.FirstName } on p1.ID equals p2.ID - 1 | |
78 where p1.ID == 1 | |
79 select new Person { ID = p1.ID, FirstName = p2.FirstName }); | |
80 } | |
81 | |
82 [Test] | |
83 public void InnerJoin7() | |
84 { | |
85 var expected = | |
86 from t in | |
87 from ch in Child | |
88 join p in Parent on ch.ParentID equals p.ParentID | |
89 select ch.ParentID + p.ParentID | |
90 where t > 2 | |
91 select t; | |
92 | |
93 ForEachProvider(db => AreEqual(expected, | |
94 from t in | |
95 from ch in db.Child | |
96 join p in db.Parent on ch.ParentID equals p.ParentID | |
97 select ch.ParentID + p.ParentID | |
98 where t > 2 | |
99 select t)); | |
100 } | |
101 | |
102 [Test] | |
103 public void InnerJoin8() | |
104 { | |
105 ForEachProvider(db => AreEqual( | |
106 from t in | |
107 from ch in Child | |
108 join p in Parent on ch.ParentID equals p.ParentID | |
109 select new { ID = ch.ParentID + p.ParentID } | |
110 where t.ID > 2 | |
111 select t, | |
112 from t in | |
113 from ch in db.Child | |
114 join p in db.Parent on ch.ParentID equals p.ParentID | |
115 select new { ID = ch.ParentID + p.ParentID } | |
116 where t.ID > 2 | |
117 select t)); | |
118 } | |
119 | |
120 [Test] | |
121 public void InnerJoin9() | |
122 { | |
123 ForEachProvider(new[] { ProviderName.Access }, db => AreEqual( | |
124 from g in GrandChild | |
125 join p in Parent4 on g.Child.ParentID equals p.ParentID | |
126 where g.ParentID < 10 && p.Value1 == TypeValue.Value3 | |
127 select g, | |
128 from g in db.GrandChild | |
129 join p in db.Parent4 on g.Child.ParentID equals p.ParentID | |
130 where g.ParentID < 10 && p.Value1 == TypeValue.Value3 | |
131 select g)); | |
132 } | |
133 | |
134 [Test] | |
135 public void InnerJoin10() | |
136 { | |
137 ForEachProvider(db => AreEqual( | |
138 from p in Parent | |
139 join g in GrandChild on p.ParentID equals g.ParentID into q | |
140 from q1 in q | |
141 select new { p.ParentID, q1.GrandChildID }, | |
142 from p in db.Parent | |
143 join g in db.GrandChild on p.ParentID equals g.ParentID into q | |
144 from q1 in q | |
145 select new { p.ParentID, q1.GrandChildID })); | |
146 } | |
147 | |
148 [Test] | |
149 public void GroupJoin1() | |
150 { | |
151 ForEachProvider(db => AreEqual( | |
152 from p in Parent | |
153 join ch in Child on p.ParentID equals ch.ParentID into lj1 | |
154 where p.ParentID == 1 | |
155 select p, | |
156 from p in db.Parent | |
157 join ch in db.Child on p.ParentID equals ch.ParentID into lj1 | |
158 where p.ParentID == 1 | |
159 select p)); | |
160 } | |
161 | |
162 [Test] | |
163 public void GroupJoin2() | |
164 { | |
165 ForEachProvider(db => | |
166 { | |
167 var q = | |
168 from p in db.Parent | |
169 join c in db.Child on p.ParentID equals c.ParentID into lj | |
170 where p.ParentID == 1 | |
171 select new { p, lj }; | |
172 | |
173 var list = q.ToList(); | |
174 | |
175 Assert.AreEqual(1, list.Count); | |
176 Assert.AreEqual(1, list[0].p.ParentID); | |
177 Assert.AreEqual(1, list[0].lj.Count()); | |
178 | |
179 var ch = list[0].lj.ToList(); | |
180 | |
181 Assert.AreEqual( 1, ch[0].ParentID); | |
182 Assert.AreEqual(11, ch[0].ChildID); | |
183 }); | |
184 } | |
185 | |
186 [Test] | |
187 public void GroupJoin3() | |
188 { | |
189 var q1 = Parent | |
190 .GroupJoin( | |
191 Child, | |
192 p => p.ParentID, | |
193 ch => ch.ParentID, | |
194 (p, lj1) => new { p, lj1 = new { lj1 } } | |
195 ) | |
196 .Where (t => t.p.ParentID == 2) | |
197 .Select(t => new { t.p, t.lj1 }); | |
198 | |
199 var list1 = q1.ToList(); | |
200 | |
201 ForEachProvider(db => | |
202 { | |
203 var q2 = db.Parent | |
204 .GroupJoin( | |
205 db.Child, | |
206 p => p.ParentID, | |
207 ch => ch.ParentID, | |
208 (p, lj1) => new { p, lj1 = new { lj1 } } | |
209 ) | |
210 .Where (t => t.p.ParentID == 2) | |
211 .Select(t => new { t.p, t.lj1 }); | |
212 | |
213 var list2 = q2.ToList(); | |
214 | |
215 Assert.AreEqual(list1.Count, list2.Count); | |
216 Assert.AreEqual(list1[0].p.ParentID, list2[0].p.ParentID); | |
217 Assert.AreEqual(list1[0].lj1.lj1.Count(), list2[0].lj1.lj1.Count()); | |
218 }); | |
219 } | |
220 | |
221 [Test] | |
222 public void GroupJoin4() | |
223 { | |
224 var q1 = | |
225 from p in Parent | |
226 join ch in | |
227 from c in Child select new { c.ParentID, c.ChildID } | |
228 on p.ParentID equals ch.ParentID into lj1 | |
229 where p.ParentID == 3 | |
230 select new { p, lj1 }; | |
231 | |
232 var list1 = q1.ToList(); | |
233 | |
234 ForEachProvider(db => | |
235 { | |
236 var q2 = | |
237 from p in db.Parent | |
238 join ch in | |
239 from c in db.Child select new { c.ParentID, c.ChildID } | |
240 on p.ParentID equals ch.ParentID into lj1 | |
241 where p.ParentID == 3 | |
242 select new { p, lj1 }; | |
243 | |
244 var list2 = q2.ToList(); | |
245 | |
246 Assert.AreEqual(list1.Count, list2.Count); | |
247 Assert.AreEqual(list1[0].p.ParentID, list2[0].p.ParentID); | |
248 Assert.AreEqual(list1[0].lj1.Count(), list2[0].lj1.Count()); | |
249 }); | |
250 } | |
251 | |
252 [Test] | |
253 public void GroupJoin5() | |
254 { | |
255 ForEachProvider(db => AreEqual( | |
256 from p in Parent | |
257 join ch in Child on p.ParentID equals ch.ParentID into lj1 | |
258 where p.ParentID == 1 | |
259 select lj1.First(), | |
260 from p in db.Parent | |
261 join ch in db.Child on p.ParentID equals ch.ParentID into lj1 | |
262 where p.ParentID == 1 | |
263 select lj1.First())); | |
264 } | |
265 | |
266 [Test] | |
267 public void GroupJoin51() | |
268 { | |
269 var expected = | |
270 ( | |
271 from p in Parent | |
272 join ch in Child on p.ParentID equals ch.ParentID into lj1 | |
273 where p.ParentID == 1 | |
274 select new { p1 = lj1, p2 = lj1.First() } | |
275 ).ToList(); | |
276 | |
277 ForEachProvider(db => | |
278 { | |
279 var result = | |
280 ( | |
281 from p in db.Parent | |
282 join ch in db.Child on p.ParentID equals ch.ParentID into lj1 | |
283 where p.ParentID == 1 | |
284 select new { p1 = lj1, p2 = lj1.First() } | |
285 ).ToList(); | |
286 | |
287 Assert.AreEqual(expected.Count, result.Count); | |
288 AreEqual(expected[0].p1, result[0].p1); | |
289 }); | |
290 } | |
291 | |
292 [Test] | |
293 public void GroupJoin52() | |
294 { | |
295 ForEachProvider(db => AreEqual( | |
296 from p in Parent | |
297 join ch in Child on p.ParentID equals ch.ParentID into lj1 | |
298 where p.ParentID == 1 | |
299 select lj1.First().ParentID, | |
300 from p in db.Parent | |
301 join ch in db.Child on p.ParentID equals ch.ParentID into lj1 | |
302 where p.ParentID == 1 | |
303 select lj1.First().ParentID)); | |
304 } | |
305 | |
306 [Test] | |
307 public void GroupJoin53() | |
308 { | |
309 ForEachProvider(db => AreEqual( | |
310 from p in Parent | |
311 join ch in Child on p.ParentID equals ch.ParentID into lj1 | |
312 where p.ParentID == 1 | |
313 select lj1.Select(_ => _.ParentID).First(), | |
314 from p in db.Parent | |
315 join ch in db.Child on p.ParentID equals ch.ParentID into lj1 | |
316 where p.ParentID == 1 | |
317 select lj1.Select(_ => _.ParentID).First())); | |
318 } | |
319 | |
320 [Test] | |
321 public void GroupJoin54() | |
322 { | |
323 ForEachProvider(db => AreEqual( | |
324 from p in Parent | |
325 join ch in Child on p.ParentID equals ch.ParentID into lj1 | |
326 where p.ParentID == 1 | |
327 select new { p1 = lj1.Count(), p2 = lj1.First() }, | |
328 from p in db.Parent | |
329 join ch in db.Child on p.ParentID equals ch.ParentID into lj1 | |
330 where p.ParentID == 1 | |
331 select new { p1 = lj1.Count(), p2 = lj1.First() })); | |
332 } | |
333 | |
334 [Test] | |
335 public void GroupJoin6() | |
336 { | |
337 var n = 1; | |
338 | |
339 var q1 = | |
340 from p in Parent | |
341 join c in Child on p.ParentID + n equals c.ParentID into lj | |
342 where p.ParentID == 1 | |
343 select new { p, lj }; | |
344 | |
345 var list1 = q1.ToList(); | |
346 var ch1 = list1[0].lj.ToList(); | |
347 | |
348 ForEachProvider(db => | |
349 { | |
350 var q2 = | |
351 from p in db.Parent | |
352 join c in db.Child on p.ParentID + n equals c.ParentID into lj | |
353 where p.ParentID == 1 | |
354 select new { p, lj }; | |
355 | |
356 var list2 = q2.ToList(); | |
357 | |
358 Assert.AreEqual(list1.Count, list2.Count); | |
359 Assert.AreEqual(list1[0].p.ParentID, list2[0].p.ParentID); | |
360 Assert.AreEqual(list1[0].lj.Count(), list2[0].lj.Count()); | |
361 | |
362 var ch2 = list2[0].lj.ToList(); | |
363 | |
364 Assert.AreEqual(ch1[0].ParentID, ch2[0].ParentID); | |
365 Assert.AreEqual(ch1[0].ChildID, ch2[0].ChildID); | |
366 }); | |
367 } | |
368 | |
369 [Test] | |
370 public void GroupJoin7() | |
371 { | |
372 var n = 1; | |
373 | |
374 var q1 = | |
375 from p in Parent | |
376 join c in Child on new { id = p.ParentID } equals new { id = c.ParentID - n } into j | |
377 where p.ParentID == 1 | |
378 select new { p, j }; | |
379 | |
380 var list1 = q1.ToList(); | |
381 var ch1 = list1[0].j.ToList(); | |
382 | |
383 ForEachProvider( | |
384 new[] { ProviderName.Firebird }, | |
385 db => | |
386 { | |
387 var q2 = | |
388 from p in db.Parent | |
389 join c in db.Child on new { id = p.ParentID } equals new { id = c.ParentID - n } into j | |
390 where p.ParentID == 1 | |
391 select new { p, j }; | |
392 | |
393 var list2 = q2.ToList(); | |
394 | |
395 Assert.AreEqual(list1.Count, list2.Count); | |
396 Assert.AreEqual(list1[0].p.ParentID, list2[0].p.ParentID); | |
397 Assert.AreEqual(list1[0].j.Count(), list2[0].j.Count()); | |
398 | |
399 var ch2 = list2[0].j.ToList(); | |
400 | |
401 Assert.AreEqual(ch1[0].ParentID, ch2[0].ParentID); | |
402 Assert.AreEqual(ch1[0].ChildID, ch2[0].ChildID); | |
403 }); | |
404 } | |
405 | |
406 [Test] | |
407 public void GroupJoin8() | |
408 { | |
409 ForEachProvider(db => AreEqual( | |
410 from p in Parent | |
411 join c in Child on p.ParentID equals c.ParentID into g | |
412 select new | |
413 { | |
414 Child = g.FirstOrDefault() | |
415 }, | |
416 from p in db.Parent | |
417 join c in db.Child on p.ParentID equals c.ParentID into g | |
418 select new | |
419 { | |
420 Child = g.FirstOrDefault() | |
421 } | |
422 )); | |
423 } | |
424 | |
425 [Test] | |
426 public void GroupJoin9() | |
427 { | |
428 ForEachProvider(db => AreEqual( | |
429 Parent | |
430 .GroupJoin( | |
431 Parent, | |
432 x => new { Id = x.ParentID }, | |
433 y => new { Id = y.ParentID }, | |
434 (xid, yid) => new { xid, yid } | |
435 ) | |
436 .SelectMany( | |
437 y => y.yid.DefaultIfEmpty(), | |
438 (x1, y) => new { x1.xid, y } | |
439 ) | |
440 .GroupJoin( | |
441 Parent, | |
442 x => new { Id = x.xid.ParentID }, | |
443 y => new { Id = y.ParentID }, | |
444 (x2, y) => new { x2.xid, x2.y, h = y } | |
445 ) | |
446 .SelectMany( | |
447 a => a.h.DefaultIfEmpty(), | |
448 (x3, a) => new { x3.xid, x3.y, a } | |
449 ) | |
450 .GroupJoin( | |
451 Parent, | |
452 x => new { Id = x.xid.ParentID }, | |
453 y => new { Id = y.ParentID }, | |
454 (x4, y) => new { x4.xid, x4.y, x4.a, p = y } | |
455 ) | |
456 .SelectMany( | |
457 z => z.p.DefaultIfEmpty(), | |
458 (x5, z) => new { x5.xid, z, x5.y, x5.a } | |
459 ) | |
460 .GroupJoin( | |
461 Parent, | |
462 x => new { Id = x.xid.ParentID }, | |
463 y => new { Id = y.Value1 ?? 1 }, | |
464 (x6, y) => new { x6.xid, xy = x6.y, x6.a, x6.z, y } | |
465 ) | |
466 .SelectMany( | |
467 z => z.y.DefaultIfEmpty(), | |
468 (x7, z) => new { x7.xid, z, x7.xy, x7.a, xz = x7.z } | |
469 ) | |
470 .GroupJoin( | |
471 Parent, | |
472 x => new { Id = x.xid.ParentID }, | |
473 y => new { Id = y.ParentID }, | |
474 (x8, y) => new { x8.xid, x8.z, x8.xy, x8.a, x8.xz, y } | |
475 ) | |
476 .SelectMany( | |
477 a => a.y.DefaultIfEmpty(), | |
478 (x9, a) => new { x9.xid, x9.z, x9.xy, xa = x9.a, x9.xz, a } | |
479 ), | |
480 db.Parent | |
481 .GroupJoin( | |
482 db.Parent, | |
483 x => new { Id = x.ParentID }, | |
484 y => new { Id = y.ParentID }, | |
485 (xid, yid) => new { xid, yid } | |
486 ) | |
487 .SelectMany( | |
488 y => y.yid.DefaultIfEmpty(), | |
489 (x1, y) => new { x1.xid, y } | |
490 ) | |
491 .GroupJoin( | |
492 db.Parent, | |
493 x => new { Id = x.xid.ParentID }, | |
494 y => new { Id = y.ParentID }, | |
495 (x2, y) => new { x2.xid, x2.y, h = y } | |
496 ) | |
497 .SelectMany( | |
498 a => a.h.DefaultIfEmpty(), | |
499 (x3, a) => new { x3.xid, x3.y, a } | |
500 ) | |
501 .GroupJoin( | |
502 db.Parent, | |
503 x => new { Id = x.xid.ParentID }, | |
504 y => new { Id = y.ParentID }, | |
505 (x4, y) => new { x4.xid, x4.y, x4.a, p = y } | |
506 ) | |
507 .SelectMany( | |
508 z => z.p.DefaultIfEmpty(), | |
509 (x5, z) => new { x5.xid, z, x5.y, x5.a } | |
510 ) | |
511 .GroupJoin( | |
512 db.Parent, | |
513 x => new { Id = x.xid.ParentID }, | |
514 y => new { Id = y.Value1 ?? 1 }, | |
515 (x6, y) => new { x6.xid, xy = x6.y, x6.a, x6.z, y } | |
516 ) | |
517 .SelectMany( | |
518 z => z.y.DefaultIfEmpty(), | |
519 (x7, z) => new { x7.xid, z, x7.xy, x7.a, xz = x7.z } | |
520 ) | |
521 .GroupJoin( | |
522 db.Parent, | |
523 x => new { Id = x.xid.ParentID }, | |
524 y => new { Id = y.ParentID }, | |
525 (x8, y) => new { x8.xid, x8.z, x8.xy, x8.a, x8.xz, y } | |
526 ) | |
527 .SelectMany( | |
528 a => a.y.DefaultIfEmpty(), | |
529 (x9, a) => new { x9.xid, x9.z, x9.xy, xa = x9.a, x9.xz, a } | |
530 ))); | |
531 } | |
532 | |
533 [Test] | |
534 public void LeftJoin1() | |
535 { | |
536 var expected = | |
537 from p in Parent | |
538 join ch in Child on p.ParentID equals ch.ParentID into lj1 | |
539 from ch in lj1.DefaultIfEmpty() | |
540 where p.ParentID >= 4 | |
541 select new { p, ch }; | |
542 | |
543 ForEachProvider(db => AreEqual(expected, | |
544 from p in db.Parent | |
545 join ch in db.Child on p.ParentID equals ch.ParentID into lj1 | |
546 from ch in lj1.DefaultIfEmpty() | |
547 where p.ParentID >= 4 | |
548 select new { p, ch })); | |
549 } | |
550 | |
551 [Test] | |
552 public void LeftJoin2() | |
553 { | |
554 ForEachProvider(db => AreEqual( | |
555 from p in Parent | |
556 join ch in Child on p.ParentID equals ch.ParentID into lj1 | |
557 from ch in lj1.DefaultIfEmpty() | |
558 select new { p, ch }, | |
559 from p in db.Parent | |
560 join ch in db.Child on p.ParentID equals ch.ParentID into lj1 | |
561 from ch in lj1.DefaultIfEmpty() | |
562 select new { p, ch })); | |
563 } | |
564 | |
565 [Test] | |
566 public void LeftJoin3() | |
567 { | |
568 ForEachProvider(db => AreEqual( | |
569 from c in Child select c.Parent, | |
570 from c in db.Child select c.Parent)); | |
571 } | |
572 | |
573 [Test] | |
574 public void LeftJoin4() | |
575 { | |
576 ForEachProvider(db => AreEqual( | |
577 Parent | |
578 .GroupJoin(Child, | |
579 x => new { x.ParentID, x.Value1 }, | |
580 y => new { y.ParentID, Value1 = (int?)y.ParentID }, | |
581 (x, y) => new { Parent = x, Child = y }) | |
582 .SelectMany( | |
583 y => y.Child.DefaultIfEmpty(), | |
584 (x, y) => new { x.Parent, Child = x.Child.FirstOrDefault() }) | |
585 .Where(x => x.Parent.ParentID == 1 && x.Parent.Value1 != null) | |
586 .OrderBy(x => x.Parent.ParentID), | |
587 db.Parent | |
588 .GroupJoin(db.Child, | |
589 x => new { x.ParentID, x.Value1 }, | |
590 y => new { y.ParentID, Value1 = (int?)y.ParentID }, | |
591 (x, y) => new { Parent = x, Child = y }) | |
592 .SelectMany( | |
593 y => y.Child.DefaultIfEmpty(), | |
594 (x, y) => new { x.Parent, Child = x.Child.FirstOrDefault() }) | |
595 .Where(x => x.Parent.ParentID == 1 && x.Parent.Value1 != null) | |
596 .OrderBy(x => x.Parent.ParentID))); | |
597 } | |
598 | |
599 public enum EnumInt | |
600 { | |
601 [MapValue(1)] One | |
602 } | |
603 | |
604 [TableName("Child")] | |
605 public class EnumChild | |
606 { | |
607 public int ParentID; | |
608 public EnumInt ChildID; | |
609 } | |
610 | |
611 [Test] | |
612 public void LeftJoin5() | |
613 { | |
614 ForEachProvider(db => | |
615 { | |
616 var q = | |
617 from p in db.Parent | |
618 join ch in new Table<EnumChild>(db) on p.ParentID equals ch.ParentID into lj1 | |
619 from ch in lj1.DefaultIfEmpty() | |
620 where ch == null | |
621 select new { p, ch }; | |
622 | |
623 var list = q.ToList(); | |
624 list.ToString(); | |
625 }); | |
626 } | |
627 | |
628 [Test] | |
629 public void SubQueryJoin() | |
630 { | |
631 var expected = | |
632 from p in Parent | |
633 join ch in | |
634 from c in Child | |
635 where c.ParentID > 0 | |
636 select new { c.ParentID, c.ChildID } | |
637 on p.ParentID equals ch.ParentID into lj1 | |
638 from ch in lj1.DefaultIfEmpty() | |
639 select p; | |
640 | |
641 ForEachProvider(db => AreEqual(expected, | |
642 from p in db.Parent | |
643 join ch in | |
644 from c in db.Child | |
645 where c.ParentID > 0 | |
646 select new { c.ParentID, c.ChildID } | |
647 on p.ParentID equals ch.ParentID into lj1 | |
648 from ch in lj1.DefaultIfEmpty() | |
649 select p)); | |
650 } | |
651 | |
652 [Test] | |
653 public void ReferenceJoin1() | |
654 { | |
655 ForEachProvider(new[] { ProviderName.Access }, db => AreEqual( | |
656 from c in Child join g in GrandChild on c equals g.Child select new { c.ParentID, g.GrandChildID }, | |
657 from c in db.Child join g in db.GrandChild on c equals g.Child select new { c.ParentID, g.GrandChildID })); | |
658 } | |
659 | |
660 [Test] | |
661 public void ReferenceJoin2() | |
662 { | |
663 ForEachProvider(new[] { ProviderName.Access }, db => AreEqual( | |
664 from g in GrandChild | |
665 join c in Child on g.Child equals c | |
666 select new { c.ParentID, g.GrandChildID }, | |
667 from g in db.GrandChild | |
668 join c in db.Child on g.Child equals c | |
669 select new { c.ParentID, g.GrandChildID })); | |
670 } | |
671 | |
672 [Test] | |
673 public void JoinByAnonymousTest() | |
674 { | |
675 ForEachProvider(new[] { ProviderName.Access }, db => AreEqual( | |
676 from p in Parent | |
677 join c in Child on new { Parent = p, p.ParentID } equals new { c.Parent, c.ParentID } | |
678 select new { p.ParentID, c.ChildID }, | |
679 from p in db.Parent | |
680 join c in db.Child on new { Parent = p, p.ParentID } equals new { c.Parent, c.ParentID } | |
681 select new { p.ParentID, c.ChildID })); | |
682 } | |
683 | |
684 [Test] | |
685 public void FourTableJoin() | |
686 { | |
687 ForEachProvider(db => AreEqual( | |
688 from p in Parent | |
689 join c1 in Child on p.ParentID equals c1.ParentID | |
690 join c2 in GrandChild on c1.ParentID equals c2.ParentID | |
691 join c3 in GrandChild on c2.ParentID equals c3.ParentID | |
692 select new { p, c1Key = c1.ChildID, c2Key = c2.GrandChildID, c3Key = c3.GrandChildID }, | |
693 from p in db.Parent | |
694 join c1 in db.Child on p.ParentID equals c1.ParentID | |
695 join c2 in db.GrandChild on c1.ParentID equals c2.ParentID | |
696 join c3 in db.GrandChild on c2.ParentID equals c3.ParentID | |
697 select new { p, c1Key = c1.ChildID, c2Key = c2.GrandChildID, c3Key = c3.GrandChildID })); | |
698 } | |
699 | |
700 [Test] | |
701 public void ProjectionTest1() | |
702 { | |
703 ForEachProvider(db => AreEqual( | |
704 from p1 in Person | |
705 join p2 in Person on p1.ID equals p2.ID | |
706 select new { ID1 = new { Value = p1.ID }, FirstName2 = p2.FirstName, } into p1 | |
707 select p1.ID1.Value, | |
708 from p1 in db.Person | |
709 join p2 in db.Person on p1.ID equals p2.ID | |
710 select new { ID1 = new { Value = p1.ID }, FirstName2 = p2.FirstName, } into p1 | |
711 select p1.ID1.Value)); | |
712 } | |
713 | |
714 [Test] | |
715 public void LeftJoinTest() | |
716 { | |
717 // Reproduces the problem described here: http://rsdn.ru/forum/prj.rfd/4221837.flat.aspx | |
718 ForEachProvider( | |
719 //Providers.Select(p => p.Name).Except(new[] { ProviderName.SQLite }).ToArray(), | |
720 db => | |
721 { | |
722 var q = | |
723 from p1 in db.Person | |
724 join p2 in db.Person on p1.ID equals p2.ID into g | |
725 from p2 in g.DefaultIfEmpty() // yes I know the join will always succeed and it'll never be null, but just for test's sake :) | |
726 select new { p1, p2 }; | |
727 | |
728 var list = q.ToList(); // NotImplementedException? :( | |
729 Assert.That(list, Is.Not.Empty); | |
730 }); | |
731 } | |
732 | |
733 [Test] | |
734 public void LeftJoinTest2() | |
735 { | |
736 // THIS TEST MUST BE RUN IN RELEASE CONFIGURATION (BECAUSE IT PASSES UNDER DEBUG CONFIGURATION) | |
737 // Reproduces the problem described here: http://rsdn.ru/forum/prj.rfd/4221837.flat.aspx | |
738 | |
739 ForEachProvider( | |
740 Providers.Select(p => p.Name).Except(new[] { ProviderName.SQLite }).ToArray(), | |
741 db => | |
742 { | |
743 var q = | |
744 from p1 in db.Patient | |
745 join p2 in db.Patient on p1.Diagnosis equals p2.Diagnosis into g | |
746 from p2 in g.DefaultIfEmpty() // yes I know the join will always succeed and it'll never be null, but just for test's sake :) | |
747 join p3 in db.Person on p2.PersonID equals p3.ID | |
748 select new { p1, p2, p3 }; | |
749 | |
750 var arr = q.ToArray(); // NotImplementedException? :( | |
751 Assert.That(arr, Is.Not.Empty); | |
752 }); | |
753 } | |
754 | |
755 [Test] | |
756 public void StackOverflow([IncludeDataContexts("Sql2008", "Sql2012")] string context) | |
757 { | |
758 using (var db = new TestDbManager(context)) | |
759 { | |
760 var q = | |
761 from c in db.Child | |
762 join p in db.Parent on c.ParentID equals p.ParentID | |
763 select new { p, c }; | |
764 | |
765 for (var i = 0; i < 100; i++) | |
766 { | |
767 q = | |
768 from c in q | |
769 join p in db.Parent on c.p.ParentID equals p.ParentID | |
770 select new { p, c.c }; | |
771 } | |
772 | |
773 var list = q.ToList(); | |
774 } | |
775 } | |
776 | |
777 [Test] | |
778 public void ApplyJoin([IncludeDataContexts("Sql2008")] string context) | |
779 { | |
780 using (var db = new TestDbManager(context)) | |
781 { | |
782 var q = | |
783 from ch in db.Child | |
784 from p in new Model.Functions(db).GetParentByID(ch.Parent.ParentID) | |
785 select p; | |
786 | |
787 q.ToList(); | |
788 } | |
789 } | |
790 | |
791 [Test] | |
792 public void Issue257([DataContexts] string context) | |
793 { | |
794 using (var db = GetDataContext(context)) | |
795 { | |
796 var q = | |
797 from m in db.Types | |
798 join p in db.Parent on m.ID equals p.ParentID | |
799 group m by new | |
800 { | |
801 m.DateTimeValue.Date | |
802 } | |
803 into b | |
804 select new | |
805 { | |
806 QualiStatusByDate = b.Key, | |
807 Count = b.Count() | |
808 }; | |
809 | |
810 q.ToList(); | |
811 } | |
812 } | |
813 } | |
814 } |