Mercurial > pub > bltoolkit
comparison UnitTests/Linq/GroupByTest.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 NUnit.Framework; | |
| 5 | |
| 6 using BLToolkit.Data.DataProvider; | |
| 7 | |
| 8 namespace Data.Linq | |
| 9 { | |
| 10 using Model; | |
| 11 | |
| 12 [TestFixture] | |
| 13 public class GroupByTest : TestBase | |
| 14 { | |
| 15 [Test] | |
| 16 public void Simple1() | |
| 17 { | |
| 18 BLToolkit.Common.Configuration.Linq.PreloadGroups = true; | |
| 19 | |
| 20 ForEachProvider(db => | |
| 21 { | |
| 22 var q = | |
| 23 from ch in db.Child | |
| 24 group ch by ch.ParentID; | |
| 25 | |
| 26 var list = q.ToList().Where(n => n.Key < 6).OrderBy(n => n.Key).ToList(); | |
| 27 | |
| 28 Assert.AreEqual(4, list.Count); | |
| 29 | |
| 30 for (var i = 0; i < list.Count; i++) | |
| 31 { | |
| 32 var values = list[i].OrderBy(c => c.ChildID).ToList(); | |
| 33 | |
| 34 Assert.AreEqual(i + 1, list[i].Key); | |
| 35 Assert.AreEqual(i + 1, values.Count); | |
| 36 | |
| 37 for (var j = 0; j < values.Count; j++) | |
| 38 Assert.AreEqual((i + 1) * 10 + j + 1, values[j].ChildID); | |
| 39 } | |
| 40 }); | |
| 41 } | |
| 42 | |
| 43 [Test] | |
| 44 public void Simple2() | |
| 45 { | |
| 46 BLToolkit.Common.Configuration.Linq.PreloadGroups = false; | |
| 47 | |
| 48 ForEachProvider(db => | |
| 49 { | |
| 50 var q = | |
| 51 from ch in db.GrandChild | |
| 52 group ch by new { ch.ParentID, ch.ChildID }; | |
| 53 | |
| 54 var list = q.ToList(); | |
| 55 | |
| 56 Assert.AreEqual (8, list.Count); | |
| 57 Assert.AreNotEqual(0, list.OrderBy(c => c.Key.ParentID).First().ToList().Count); | |
| 58 }); | |
| 59 } | |
| 60 | |
| 61 [Test] | |
| 62 public void Simple3() | |
| 63 { | |
| 64 ForEachProvider(db => | |
| 65 { | |
| 66 var q = | |
| 67 from ch in db.Child | |
| 68 group ch by ch.ParentID into g | |
| 69 select g.Key; | |
| 70 | |
| 71 var list = q.ToList().Where(n => n < 6).OrderBy(n => n).ToList(); | |
| 72 | |
| 73 Assert.AreEqual(4, list.Count); | |
| 74 for (var i = 0; i < list.Count; i++) Assert.AreEqual(i + 1, list[i]); | |
| 75 }); | |
| 76 } | |
| 77 | |
| 78 [Test] | |
| 79 public void Simple4() | |
| 80 { | |
| 81 ForEachProvider(db => | |
| 82 { | |
| 83 var q = | |
| 84 from ch in db.Child | |
| 85 group ch by ch.ParentID into g | |
| 86 orderby g.Key | |
| 87 select g.Key; | |
| 88 | |
| 89 var list = q.ToList().Where(n => n < 6).ToList(); | |
| 90 | |
| 91 Assert.AreEqual(4, list.Count); | |
| 92 for (var i = 0; i < list.Count; i++) Assert.AreEqual(i + 1, list[i]); | |
| 93 }); | |
| 94 } | |
| 95 | |
| 96 [Test] | |
| 97 public void Simple5() | |
| 98 { | |
| 99 var expected = | |
| 100 from ch in GrandChild | |
| 101 group ch by new { ch.ParentID, ch.ChildID } into g | |
| 102 group g by new { g.Key.ParentID } into g | |
| 103 select g.Key; | |
| 104 | |
| 105 ForEachProvider(db => AreEqual(expected, | |
| 106 from ch in db.GrandChild | |
| 107 group ch by new { ch.ParentID, ch.ChildID } into g | |
| 108 group g by new { g.Key.ParentID } into g | |
| 109 select g.Key)); | |
| 110 } | |
| 111 | |
| 112 [Test] | |
| 113 public void Simple6() | |
| 114 { | |
| 115 ForEachProvider(db => | |
| 116 { | |
| 117 var q = db.GrandChild.GroupBy(ch => new { ch.ParentID, ch.ChildID }, ch => ch.GrandChildID); | |
| 118 var list = q.ToList(); | |
| 119 | |
| 120 Assert.AreNotEqual(0, list[0].Count()); | |
| 121 Assert.AreEqual (8, list.Count); | |
| 122 }); | |
| 123 } | |
| 124 | |
| 125 [Test] | |
| 126 public void Simple7() | |
| 127 { | |
| 128 ForEachProvider(db => | |
| 129 { | |
| 130 var q = db.GrandChild | |
| 131 .GroupBy(ch => new { ch.ParentID, ch.ChildID }, ch => ch.GrandChildID) | |
| 132 .Select (gr => new { gr.Key.ParentID, gr.Key.ChildID }); | |
| 133 | |
| 134 var list = q.ToList(); | |
| 135 Assert.AreEqual(8, list.Count); | |
| 136 }); | |
| 137 } | |
| 138 | |
| 139 [Test] | |
| 140 public void Simple8() | |
| 141 { | |
| 142 ForEachProvider(db => | |
| 143 { | |
| 144 var q = db.GrandChild.GroupBy(ch => new { ch.ParentID, ch.ChildID }, (g,ch) => g.ChildID); | |
| 145 | |
| 146 var list = q.ToList(); | |
| 147 Assert.AreEqual(8, list.Count); | |
| 148 }); | |
| 149 } | |
| 150 | |
| 151 [Test] | |
| 152 public void Simple9() | |
| 153 { | |
| 154 ForEachProvider(db => | |
| 155 { | |
| 156 var q = db.GrandChild.GroupBy(ch => new { ch.ParentID, ch.ChildID }, ch => ch.GrandChildID, (g,ch) => g.ChildID); | |
| 157 var list = q.ToList(); | |
| 158 | |
| 159 Assert.AreEqual(8, list.Count); | |
| 160 }); | |
| 161 } | |
| 162 | |
| 163 [Test] | |
| 164 public void Simple10() | |
| 165 { | |
| 166 var expected = (from ch in Child group ch by ch.ParentID into g select g).ToList().OrderBy(p => p.Key).ToList(); | |
| 167 | |
| 168 ForEachProvider(db => | |
| 169 { | |
| 170 var result = (from ch in db.Child group ch by ch.ParentID into g select g).ToList().OrderBy(p => p.Key).ToList(); | |
| 171 | |
| 172 AreEqual(expected[0], result[0]); | |
| 173 AreEqual(expected.Select(p => p.Key), result.Select(p => p.Key)); | |
| 174 AreEqual(expected[0].ToList(), result[0].ToList()); | |
| 175 }); | |
| 176 } | |
| 177 | |
| 178 [Test] | |
| 179 public void Simple11() | |
| 180 { | |
| 181 ForEachProvider(db => | |
| 182 { | |
| 183 var q1 = GrandChild | |
| 184 .GroupBy(ch => new { ParentID = ch.ParentID + 1, ch.ChildID }, ch => ch.ChildID); | |
| 185 | |
| 186 var q2 = db.GrandChild | |
| 187 .GroupBy(ch => new { ParentID = ch.ParentID + 1, ch.ChildID }, ch => ch.ChildID); | |
| 188 | |
| 189 var list1 = q1.AsEnumerable().OrderBy(_ => _.Key.ChildID).ToList(); | |
| 190 var list2 = q2.AsEnumerable().OrderBy(_ => _.Key.ChildID).ToList(); | |
| 191 | |
| 192 Assert.AreEqual(list1.Count, list2.Count); | |
| 193 Assert.AreEqual(list1[0].ToList(), list2[0].ToList()); | |
| 194 }); | |
| 195 } | |
| 196 | |
| 197 [Test] | |
| 198 public void Simple12() | |
| 199 { | |
| 200 ForEachProvider(db => | |
| 201 { | |
| 202 var q = db.GrandChild | |
| 203 .GroupBy(ch => new { ParentID = ch.ParentID + 1, ch.ChildID }, (g,ch) => g.ChildID); | |
| 204 | |
| 205 var list = q.ToList(); | |
| 206 Assert.AreEqual(8, list.Count); | |
| 207 }); | |
| 208 } | |
| 209 | |
| 210 [Test] | |
| 211 public void Simple13() | |
| 212 { | |
| 213 ForEachProvider(db => | |
| 214 { | |
| 215 var q = db.GrandChild | |
| 216 .GroupBy(ch => new { ParentID = ch.ParentID + 1, ch.ChildID }, ch => ch.ChildID, (g,ch) => g.ChildID); | |
| 217 | |
| 218 var list = q.ToList(); | |
| 219 Assert.AreEqual(8, list.Count); | |
| 220 }); | |
| 221 } | |
| 222 | |
| 223 //[Test] | |
| 224 public void Simple14() | |
| 225 { | |
| 226 ForEachProvider(db => AreEqual( | |
| 227 from p in Parent | |
| 228 select | |
| 229 from c in p.Children | |
| 230 group c by c.ParentID into g | |
| 231 select g.Key, | |
| 232 from p in db.Parent | |
| 233 select | |
| 234 from c in p.Children | |
| 235 group c by c.ParentID into g | |
| 236 select g.Key)); | |
| 237 } | |
| 238 | |
| 239 [Test] | |
| 240 public void MemberInit1() | |
| 241 { | |
| 242 ForEachProvider(db => AreEqual( | |
| 243 from ch in Child | |
| 244 group ch by new Child { ParentID = ch.ParentID } into g | |
| 245 select g.Key, | |
| 246 from ch in db.Child | |
| 247 group ch by new Child { ParentID = ch.ParentID } into g | |
| 248 select g.Key)); | |
| 249 } | |
| 250 | |
| 251 class GroupByInfo | |
| 252 { | |
| 253 public GroupByInfo Prev; | |
| 254 public object Field; | |
| 255 | |
| 256 public override bool Equals(object obj) | |
| 257 { | |
| 258 return Equals(obj as GroupByInfo); | |
| 259 } | |
| 260 | |
| 261 public bool Equals(GroupByInfo other) | |
| 262 { | |
| 263 if (ReferenceEquals(null, other)) return false; | |
| 264 if (ReferenceEquals(this, other)) return true; | |
| 265 return Equals(other.Prev, Prev) && Equals(other.Field, Field); | |
| 266 } | |
| 267 | |
| 268 public override int GetHashCode() | |
| 269 { | |
| 270 unchecked | |
| 271 { | |
| 272 return ((Prev != null ? Prev.GetHashCode() : 0) * 397) ^ (Field != null ? Field.GetHashCode() : 0); | |
| 273 } | |
| 274 } | |
| 275 } | |
| 276 | |
| 277 [Test] | |
| 278 public void MemberInit2() | |
| 279 { | |
| 280 ForEachProvider(db => AreEqual( | |
| 281 from ch in Child | |
| 282 group ch by new GroupByInfo { Prev = new GroupByInfo { Field = ch.ParentID }, Field = ch.ChildID } into g | |
| 283 select g.Key, | |
| 284 from ch in db.Child | |
| 285 group ch by new GroupByInfo { Prev = new GroupByInfo { Field = ch.ParentID }, Field = ch.ChildID } into g | |
| 286 select g.Key)); | |
| 287 } | |
| 288 | |
| 289 [Test] | |
| 290 public void MemberInit3() | |
| 291 { | |
| 292 ForEachProvider(db => AreEqual( | |
| 293 from ch in Child | |
| 294 group ch by new { Prev = new { Field = ch.ParentID }, Field = ch.ChildID } into g | |
| 295 select g.Key, | |
| 296 from ch in db.Child | |
| 297 group ch by new { Prev = new { Field = ch.ParentID }, Field = ch.ChildID } into g | |
| 298 select g.Key)); | |
| 299 } | |
| 300 | |
| 301 [Test] | |
| 302 public void SubQuery1() | |
| 303 { | |
| 304 var n = 1; | |
| 305 | |
| 306 var expected = | |
| 307 from ch in | |
| 308 from ch in Child select ch.ParentID + 1 | |
| 309 where ch + 1 > n | |
| 310 group ch by ch into g | |
| 311 select g.Key; | |
| 312 | |
| 313 ForEachProvider(db => AreEqual(expected, | |
| 314 from ch in | |
| 315 from ch in db.Child select ch.ParentID + 1 | |
| 316 where ch > n | |
| 317 group ch by ch into g | |
| 318 select g.Key)); | |
| 319 } | |
| 320 | |
| 321 [Test] | |
| 322 public void SubQuery2() | |
| 323 { | |
| 324 var n = 1; | |
| 325 | |
| 326 var expected = | |
| 327 from ch in Child select new { ParentID = ch.ParentID + 1 } into ch | |
| 328 where ch.ParentID > n | |
| 329 group ch by ch into g | |
| 330 select g.Key; | |
| 331 | |
| 332 ForEachProvider(db => AreEqual(expected, | |
| 333 from ch in db.Child select new { ParentID = ch.ParentID + 1 } into ch | |
| 334 where ch.ParentID > n | |
| 335 group ch by ch into g | |
| 336 select g.Key)); | |
| 337 } | |
| 338 | |
| 339 [Test] | |
| 340 public void SubQuery3() | |
| 341 { | |
| 342 ForEachProvider(db => AreEqual( | |
| 343 from ch in | |
| 344 from ch in Child | |
| 345 select new { ch, n = ch.ChildID + 1 } | |
| 346 group ch by ch.n into g | |
| 347 select new | |
| 348 { | |
| 349 g.Key, | |
| 350 Sum = g.Sum(_ => _.ch.ParentID) | |
| 351 }, | |
| 352 from ch in | |
| 353 from ch in db.Child | |
| 354 select new { ch, n = ch.ChildID + 1 } | |
| 355 group ch by ch.n into g | |
| 356 select new | |
| 357 { | |
| 358 g.Key, | |
| 359 Sum = g.Sum(_ => _.ch.ParentID) | |
| 360 })); | |
| 361 } | |
| 362 | |
| 363 [Test] | |
| 364 public void SubQuery31() | |
| 365 { | |
| 366 ForEachProvider(db => AreEqual( | |
| 367 from ch in | |
| 368 from ch in Child | |
| 369 select new { ch, n = ch.ChildID + 1 } | |
| 370 group ch.ch by ch.n into g | |
| 371 select new | |
| 372 { | |
| 373 g.Key, | |
| 374 Sum = g.Sum(_ => _.ParentID) | |
| 375 }, | |
| 376 from ch in | |
| 377 from ch in db.Child | |
| 378 select new { ch, n = ch.ChildID + 1 } | |
| 379 group ch.ch by ch.n into g | |
| 380 select new | |
| 381 { | |
| 382 g.Key, | |
| 383 Sum = g.Sum(_ => _.ParentID) | |
| 384 })); | |
| 385 } | |
| 386 | |
| 387 [Test] | |
| 388 public void SubQuery32() | |
| 389 { | |
| 390 ForEachProvider(db => AreEqual( | |
| 391 from ch in | |
| 392 from ch in Child | |
| 393 select new { ch, n = ch.ChildID + 1 } | |
| 394 group ch.ch.ParentID by ch.n into g | |
| 395 select new | |
| 396 { | |
| 397 g.Key, | |
| 398 Sum = g.Sum(_ => _) | |
| 399 }, | |
| 400 from ch in | |
| 401 from ch in db.Child | |
| 402 select new { ch, n = ch.ChildID + 1 } | |
| 403 group ch.ch.ParentID by ch.n into g | |
| 404 select new | |
| 405 { | |
| 406 g.Key, | |
| 407 Sum = g.Sum(_ => _) | |
| 408 })); | |
| 409 } | |
| 410 | |
| 411 [Test] | |
| 412 public void SubQuery4() | |
| 413 { | |
| 414 ForEachProvider(db => AreEqual( | |
| 415 from ch in Child | |
| 416 group ch by new { n = ch.ChildID + 1 } into g | |
| 417 select new | |
| 418 { | |
| 419 g.Key, | |
| 420 Sum = g.Sum(_ => _.ParentID) | |
| 421 }, | |
| 422 from ch in db.Child | |
| 423 group ch by new { n = ch.ChildID + 1 } into g | |
| 424 select new | |
| 425 { | |
| 426 g.Key, | |
| 427 Sum = g.Sum(_ => _.ParentID) | |
| 428 })); | |
| 429 } | |
| 430 | |
| 431 [Test] | |
| 432 public void SubQuery5() | |
| 433 { | |
| 434 ForEachProvider(db => AreEqual( | |
| 435 from ch in Child | |
| 436 join p in Parent on ch.ParentID equals p.ParentID into pg | |
| 437 from p in pg.DefaultIfEmpty() | |
| 438 group ch by ch.ChildID into g | |
| 439 select g.Sum(_ => _.ParentID), | |
| 440 from ch in db.Child | |
| 441 join p in db.Parent on ch.ParentID equals p.ParentID into pg | |
| 442 from p in pg.DefaultIfEmpty() | |
| 443 group ch by ch.ChildID into g | |
| 444 select g.Sum(_ => _.ParentID))); | |
| 445 } | |
| 446 | |
| 447 [Test] | |
| 448 public void SubQuery6() | |
| 449 { | |
| 450 var expected = | |
| 451 from ch in Child select new { ParentID = ch.ParentID + 1 } into ch | |
| 452 group ch.ParentID by ch into g | |
| 453 select g.Key; | |
| 454 | |
| 455 ForEachProvider(db => AreEqual(expected, | |
| 456 from ch in db.Child select new { ParentID = ch.ParentID + 1 } into ch | |
| 457 group ch.ParentID by ch into g | |
| 458 select g.Key)); | |
| 459 } | |
| 460 | |
| 461 [Test] | |
| 462 public void SubQuery7() | |
| 463 { | |
| 464 ForEachProvider(db => AreEqual( | |
| 465 from p in Parent | |
| 466 join c in | |
| 467 from c in Child | |
| 468 where c.ParentID == 1 | |
| 469 select c | |
| 470 on p.ParentID equals c.ParentID into g | |
| 471 from c in g.DefaultIfEmpty() | |
| 472 group p by c == null ? 0 : c.ChildID into gg | |
| 473 select new { gg.Key }, | |
| 474 from p in db.Parent | |
| 475 join c in | |
| 476 from c in db.Child | |
| 477 where c.ParentID == 1 | |
| 478 select c | |
| 479 on p.ParentID equals c.ParentID into g | |
| 480 from c in g.DefaultIfEmpty() | |
| 481 group p by c.ChildID into gg | |
| 482 select new { gg.Key })); | |
| 483 } | |
| 484 | |
| 485 [Test] | |
| 486 public void Calculated1() | |
| 487 { | |
| 488 var expected = | |
| 489 ( | |
| 490 from ch in Child | |
| 491 group ch by ch.ParentID > 2 ? ch.ParentID > 3 ? "1" : "2" : "3" | |
| 492 into g select g | |
| 493 ).ToList().OrderBy(p => p.Key).ToList(); | |
| 494 | |
| 495 ForEachProvider(db => | |
| 496 { | |
| 497 var result = | |
| 498 ( | |
| 499 from ch in db.Child | |
| 500 group ch by ch.ParentID > 2 ? ch.ParentID > 3 ? "1" : "2" : "3" | |
| 501 into g select g | |
| 502 ).ToList().OrderBy(p => p.Key).ToList(); | |
| 503 | |
| 504 AreEqual(expected[0], result[0]); | |
| 505 AreEqual(expected.Select(p => p.Key), result.Select(p => p.Key)); | |
| 506 }); | |
| 507 } | |
| 508 | |
| 509 [Test] | |
| 510 public void Calculated2() | |
| 511 { | |
| 512 var expected = | |
| 513 from p in | |
| 514 from ch in | |
| 515 from ch in Child | |
| 516 group ch by ch.ParentID > 2 ? ch.ParentID > 3 ? "1" : "2" : "3" | |
| 517 into g select g | |
| 518 select ch.Key + "2" | |
| 519 where p == "22" | |
| 520 select p; | |
| 521 | |
| 522 ForEachProvider(db => AreEqual(expected, | |
| 523 from p in | |
| 524 from ch in | |
| 525 from ch in db.Child | |
| 526 group ch by ch.ParentID > 2 ? ch.ParentID > 3 ? "1" : "2" : "3" | |
| 527 into g select g | |
| 528 select ch.Key + "2" | |
| 529 where p == "22" | |
| 530 select p)); | |
| 531 } | |
| 532 | |
| 533 [Test] | |
| 534 public void GroupBy1() | |
| 535 { | |
| 536 ForEachProvider(db => AreEqual( | |
| 537 Child.GroupBy(ch => ch.ParentID).GroupBy(ch => ch).GroupBy(ch => ch).Select(p => p.Key.Key.Key), | |
| 538 db.Child.GroupBy(ch => ch.ParentID).GroupBy(ch => ch).GroupBy(ch => ch).Select(p => p.Key.Key.Key))); | |
| 539 } | |
| 540 | |
| 541 [Test] | |
| 542 public void GroupBy2() | |
| 543 { | |
| 544 ForEachProvider(db => AreEqual( | |
| 545 from p in Parent | |
| 546 join c in Child on p.ParentID equals c.ParentID | |
| 547 group p by new | |
| 548 { | |
| 549 ID = p.Value1 ?? c.ChildID | |
| 550 } into gr | |
| 551 select new | |
| 552 { | |
| 553 gr.Key.ID, | |
| 554 ID1 = gr.Key.ID + 1, | |
| 555 }, | |
| 556 from p in db.Parent | |
| 557 join c in db.Child on p.ParentID equals c.ParentID | |
| 558 group p by new | |
| 559 { | |
| 560 ID = p.Value1 ?? c.ChildID | |
| 561 } into gr | |
| 562 select new | |
| 563 { | |
| 564 gr.Key.ID, | |
| 565 ID1 = gr.Key.ID + 1, | |
| 566 })); | |
| 567 } | |
| 568 | |
| 569 [Test] | |
| 570 public void GroupBy3() | |
| 571 { | |
| 572 ForEachProvider(db => AreEqual( | |
| 573 from p in Parent | |
| 574 join c in Child on p.ParentID equals c.ParentID | |
| 575 group p by p.Value1 ?? c.ChildID into gr | |
| 576 select new | |
| 577 { | |
| 578 gr.Key | |
| 579 }, | |
| 580 from p in db.Parent | |
| 581 join c in db.Child on p.ParentID equals c.ParentID | |
| 582 group p by p.Value1 ?? c.ChildID into gr | |
| 583 select new | |
| 584 { | |
| 585 gr.Key | |
| 586 })); | |
| 587 } | |
| 588 | |
| 589 [Test] | |
| 590 public void Sum1() | |
| 591 { | |
| 592 var expected = | |
| 593 from ch in Child | |
| 594 group ch by ch.ParentID into g | |
| 595 select g.Sum(p => p.ChildID); | |
| 596 | |
| 597 ForEachProvider(db => AreEqual(expected, | |
| 598 from ch in db.Child | |
| 599 group ch by ch.ParentID into g | |
| 600 select g.Sum(p => p.ChildID))); | |
| 601 } | |
| 602 | |
| 603 [Test] | |
| 604 public void Sum2() | |
| 605 { | |
| 606 var expected = | |
| 607 from ch in Child | |
| 608 group ch by ch.ParentID into g | |
| 609 select new { Sum = g.Sum(p => p.ChildID) }; | |
| 610 | |
| 611 ForEachProvider(db => AreEqual(expected, | |
| 612 from ch in db.Child | |
| 613 group ch by ch.ParentID into g | |
| 614 select new { Sum = g.Sum(p => p.ChildID) })); | |
| 615 } | |
| 616 | |
| 617 [Test] | |
| 618 public void Sum3() | |
| 619 { | |
| 620 ForEachProvider( | |
| 621 new[] { ProviderName.SqlCe }, | |
| 622 db => AreEqual( | |
| 623 from ch in Child | |
| 624 group ch by ch.Parent into g | |
| 625 select g.Key.Children.Sum(p => p.ChildID), | |
| 626 from ch in db.Child | |
| 627 group ch by ch.Parent into g | |
| 628 select g.Key.Children.Sum(p => p.ChildID))); | |
| 629 } | |
| 630 | |
| 631 [Test] | |
| 632 public void SumSubQuery1() | |
| 633 { | |
| 634 var n = 1; | |
| 635 | |
| 636 var expected = | |
| 637 from ch in | |
| 638 from ch in Child select new { ParentID = ch.ParentID + 1, ch.ChildID } | |
| 639 where ch.ParentID + 1 > n group ch by ch into g | |
| 640 select g.Sum(p => p.ParentID - 3); | |
| 641 | |
| 642 ForEachProvider(db => AreEqual(expected, | |
| 643 from ch in | |
| 644 from ch in db.Child select new { ParentID = ch.ParentID + 1, ch.ChildID } | |
| 645 where ch.ParentID + 1 > n group ch by ch into g | |
| 646 select g.Sum(p => p.ParentID - 3))); | |
| 647 } | |
| 648 | |
| 649 [Test] | |
| 650 public void GroupByMax() | |
| 651 { | |
| 652 ForEachProvider(db => AreEqual( | |
| 653 from ch in Child group ch.ParentID by ch.ChildID into g select new { Max = g.Max() }, | |
| 654 from ch in db.Child group ch.ParentID by ch.ChildID into g select new { Max = g.Max() })); | |
| 655 } | |
| 656 | |
| 657 [Test] | |
| 658 public void Aggregates1() | |
| 659 { | |
| 660 ForEachProvider(db => AreEqual( | |
| 661 from ch in Child | |
| 662 group ch by ch.ParentID into g | |
| 663 select new | |
| 664 { | |
| 665 Cnt = g.Count(), | |
| 666 Sum = g.Sum(c => c.ChildID), | |
| 667 Min = g.Min(c => c.ChildID), | |
| 668 Max = g.Max(c => c.ChildID), | |
| 669 Avg = (int)g.Average(c => c.ChildID), | |
| 670 }, | |
| 671 from ch in db.Child | |
| 672 group ch by ch.ParentID into g | |
| 673 select new | |
| 674 { | |
| 675 Cnt = g.Count(), | |
| 676 Sum = g.Sum(c => c.ChildID), | |
| 677 Min = g.Min(c => c.ChildID), | |
| 678 Max = g.Max(c => c.ChildID), | |
| 679 Avg = (int)g.Average(c => c.ChildID), | |
| 680 })); | |
| 681 } | |
| 682 | |
| 683 [Test] | |
| 684 public void Aggregates2() | |
| 685 { | |
| 686 ForEachProvider(db => AreEqual( | |
| 687 from ch in Child | |
| 688 group ch by ch.ParentID into g | |
| 689 select new | |
| 690 { | |
| 691 Sum = g.Select(c => c.ChildID).Sum(), | |
| 692 Min = g.Select(c => c.ChildID).Min(), | |
| 693 Max = g.Select(c => c.ChildID).Max(), | |
| 694 Avg = (int)g.Select(c => c.ChildID).Average(), | |
| 695 Cnt = g.Count() | |
| 696 }, | |
| 697 from ch in db.Child | |
| 698 group ch by ch.ParentID into g | |
| 699 select new | |
| 700 { | |
| 701 Sum = g.Select(c => c.ChildID).Sum(), | |
| 702 Min = g.Select(c => c.ChildID).Min(), | |
| 703 Max = g.Select(c => c.ChildID).Max(), | |
| 704 Avg = (int)g.Select(c => c.ChildID).Average(), | |
| 705 Cnt = g.Count() | |
| 706 })); | |
| 707 } | |
| 708 | |
| 709 [Test] | |
| 710 public void Aggregates3() | |
| 711 { | |
| 712 ForEachProvider( | |
| 713 new[] { ProviderName.SqlCe }, | |
| 714 db => AreEqual( | |
| 715 from ch in Child | |
| 716 where ch.ChildID > 30 | |
| 717 group ch by ch.ParentID into g | |
| 718 select new | |
| 719 { | |
| 720 Sum = g.Select(c => c.ChildID).Where(_ => _ > 30).Sum(), | |
| 721 Min = g.Select(c => c.ChildID).Where(_ => _ > 30).Min(), | |
| 722 Max = g.Select(c => c.ChildID).Where(_ => _ > 30).Max(), | |
| 723 Avg = (int)g.Select(c => c.ChildID).Where(_ => _ > 30).Average(), | |
| 724 }, | |
| 725 from ch in db.Child | |
| 726 where ch.ChildID > 30 | |
| 727 group ch by ch.ParentID into g | |
| 728 select new | |
| 729 { | |
| 730 Sum = g.Select(c => c.ChildID).Where(_ => _ > 30).Sum(), | |
| 731 Min = g.Select(c => c.ChildID).Where(_ => _ > 30).Min(), | |
| 732 Max = g.Select(c => c.ChildID).Where(_ => _ > 30).Max(), | |
| 733 Avg = (int)g.Select(c => c.ChildID).Where(_ => _ > 30).Average(), | |
| 734 })); | |
| 735 } | |
| 736 | |
| 737 [Test] | |
| 738 public void Aggregates4() | |
| 739 { | |
| 740 ForEachProvider( | |
| 741 new[] { ProviderName.SqlCe }, | |
| 742 db => AreEqual( | |
| 743 from ch in Child | |
| 744 group ch by ch.ParentID into g | |
| 745 select new | |
| 746 { | |
| 747 Count = g.Count(_ => _.ChildID > 30), | |
| 748 Sum = g.Where(_ => _.ChildID > 30).Sum(c => c.ChildID), | |
| 749 }, | |
| 750 from ch in db.Child | |
| 751 group ch by ch.ParentID into g | |
| 752 select new | |
| 753 { | |
| 754 Count = g.Count(_ => _.ChildID > 30), | |
| 755 Sum = g.Where(_ => _.ChildID > 30).Sum(c => c.ChildID), | |
| 756 })); | |
| 757 } | |
| 758 | |
| 759 [Test] | |
| 760 public void SelectMax() | |
| 761 { | |
| 762 var expected = | |
| 763 from ch in Child | |
| 764 group ch by ch.ParentID into g | |
| 765 select g.Max(c => c.ChildID); | |
| 766 | |
| 767 ForEachProvider(db => AreEqual(expected, | |
| 768 from ch in db.Child | |
| 769 group ch by ch.ParentID into g | |
| 770 select g.Max(c => c.ChildID))); | |
| 771 } | |
| 772 | |
| 773 [Test] | |
| 774 public void JoinMax() | |
| 775 { | |
| 776 var expected = | |
| 777 from ch in Child | |
| 778 join max in | |
| 779 from ch in Child | |
| 780 group ch by ch.ParentID into g | |
| 781 select g.Max(c => c.ChildID) | |
| 782 on ch.ChildID equals max | |
| 783 select ch; | |
| 784 | |
| 785 ForEachProvider(db => AreEqual(expected, | |
| 786 from ch in db.Child | |
| 787 join max in | |
| 788 from ch in db.Child | |
| 789 group ch by ch.ParentID into g | |
| 790 select g.Max(c => c.ChildID) | |
| 791 on ch.ChildID equals max | |
| 792 select ch)); | |
| 793 } | |
| 794 | |
| 795 [Test] | |
| 796 public void Min1() | |
| 797 { | |
| 798 var expected = Child.Min(c => c.ChildID); | |
| 799 ForEachProvider(db => Assert.AreEqual(expected, db.Child.Min(c => c.ChildID))); | |
| 800 } | |
| 801 | |
| 802 [Test] | |
| 803 public void Min2() | |
| 804 { | |
| 805 var expected = Child.Select(c => c.ChildID).Min(); | |
| 806 ForEachProvider(db => Assert.AreEqual(expected, db.Child.Select(c => c.ChildID).Min())); | |
| 807 } | |
| 808 | |
| 809 [Test] | |
| 810 public void Max1() | |
| 811 { | |
| 812 var expected = Child.Max(c => c.ChildID); | |
| 813 Assert.AreNotEqual(0, expected); | |
| 814 ForEachProvider(db => Assert.AreEqual(expected, db.Child.Max(c => c.ChildID))); | |
| 815 } | |
| 816 | |
| 817 [Test] | |
| 818 public void Max11() | |
| 819 { | |
| 820 ForEachProvider(db => Assert.AreEqual( | |
| 821 Child.Max(c => c.ChildID > 20), | |
| 822 db.Child.Max(c => c.ChildID > 20))); | |
| 823 } | |
| 824 | |
| 825 [Test] | |
| 826 public void Max12() | |
| 827 { | |
| 828 ForEachProvider(db => Assert.AreEqual( | |
| 829 Child.Max(c => (bool?)(c.ChildID > 20)), | |
| 830 db.Child.Max(c => (bool?)(c.ChildID > 20)))); | |
| 831 } | |
| 832 | |
| 833 [Test] | |
| 834 public void Max2() | |
| 835 { | |
| 836 var expected = | |
| 837 from p in Parent | |
| 838 join c in Child on p.ParentID equals c.ParentID | |
| 839 where c.ChildID > 20 | |
| 840 select p; | |
| 841 | |
| 842 ForEachProvider(db => | |
| 843 { | |
| 844 var result = | |
| 845 from p in db.Parent | |
| 846 join c in db.Child on p.ParentID equals c.ParentID | |
| 847 where c.ChildID > 20 | |
| 848 select p; | |
| 849 | |
| 850 Assert.AreEqual(expected.Max(p => p.ParentID), result.Max(p => p.ParentID)); | |
| 851 }); | |
| 852 } | |
| 853 | |
| 854 [Test] | |
| 855 public void Max3() | |
| 856 { | |
| 857 ForEachProvider(db => Assert.AreEqual( | |
| 858 Child.Select(c => c.ChildID).Max(), | |
| 859 db.Child.Select(c => c.ChildID).Max())); | |
| 860 } | |
| 861 | |
| 862 [Test] | |
| 863 public void Max4() | |
| 864 { | |
| 865 ForEachProvider(db => Assert.AreEqual( | |
| 866 from t1 in Types | |
| 867 join t2 in | |
| 868 from sub in Types | |
| 869 where | |
| 870 sub.ID == 1 && | |
| 871 sub.DateTimeValue <= DateTime.Today | |
| 872 group sub by new | |
| 873 { | |
| 874 sub.ID | |
| 875 } into g | |
| 876 select new | |
| 877 { | |
| 878 g.Key.ID, | |
| 879 DateTimeValue = g.Max( p => p.DateTimeValue ) | |
| 880 } | |
| 881 on new { t1.ID, t1.DateTimeValue } equals new { t2.ID, t2.DateTimeValue } | |
| 882 select t1.MoneyValue, | |
| 883 from t1 in db.Types | |
| 884 join t2 in | |
| 885 from sub in db.Types | |
| 886 where | |
| 887 sub.ID == 1 && | |
| 888 sub.DateTimeValue <= DateTime.Today | |
| 889 group sub by new | |
| 890 { | |
| 891 sub.ID | |
| 892 } into g | |
| 893 select new | |
| 894 { | |
| 895 g.Key.ID, | |
| 896 DateTimeValue = g.Max( p => p.DateTimeValue ) | |
| 897 } | |
| 898 on new { t1.ID, t1.DateTimeValue } equals new { t2.ID, t2.DateTimeValue } | |
| 899 select t1.MoneyValue | |
| 900 )); | |
| 901 } | |
| 902 | |
| 903 [Test] | |
| 904 public void Average1() | |
| 905 { | |
| 906 ForEachProvider(db => Assert.AreEqual( | |
| 907 (int)db.Child.Average(c => c.ChildID), | |
| 908 (int) Child.Average(c => c.ChildID))); | |
| 909 } | |
| 910 | |
| 911 [Test] | |
| 912 public void Average2() | |
| 913 { | |
| 914 var expected = Child.Select(c => c.ChildID).Average(); | |
| 915 ForEachProvider(db => Assert.AreEqual((int)expected, (int)db.Child.Select(c => c.ChildID).Average())); | |
| 916 } | |
| 917 | |
| 918 [Test] | |
| 919 public void GrooupByAssociation1() | |
| 920 { | |
| 921 ForEachProvider(db => AreEqual( | |
| 922 from ch in GrandChild1 | |
| 923 group ch by ch.Parent into g | |
| 924 where g.Count() > 2 | |
| 925 select g.Key.Value1 | |
| 926 , | |
| 927 from ch in db.GrandChild1 | |
| 928 group ch by ch.Parent into g | |
| 929 where g.Count() > 2 | |
| 930 select g.Key.Value1)); | |
| 931 } | |
| 932 | |
| 933 [Test] | |
| 934 public void GrooupByAssociation101() | |
| 935 { | |
| 936 ForEachProvider(db => AreEqual( | |
| 937 from ch in GrandChild1 | |
| 938 group ch by ch.Parent into g | |
| 939 where g.Max(_ => _.ParentID) > 2 | |
| 940 select g.Key.Value1 | |
| 941 , | |
| 942 from ch in db.GrandChild1 | |
| 943 group ch by ch.Parent into g | |
| 944 where g.Max(_ => _.ParentID) > 2 | |
| 945 select g.Key.Value1)); | |
| 946 } | |
| 947 | |
| 948 [Test] | |
| 949 public void GrooupByAssociation102() | |
| 950 { | |
| 951 ForEachProvider( | |
| 952 new[] { ProviderName.Informix }, | |
| 953 db => AreEqual( | |
| 954 from ch in GrandChild1 | |
| 955 group ch by ch.Parent into g | |
| 956 where g.Count(_ => _.ChildID >= 20) > 2 | |
| 957 select g.Key.Value1 | |
| 958 , | |
| 959 from ch in db.GrandChild1 | |
| 960 group ch by ch.Parent into g | |
| 961 where g.Count(_ => _.ChildID >= 20) > 2 | |
| 962 select g.Key.Value1)); | |
| 963 } | |
| 964 | |
| 965 [Test] | |
| 966 public void GrooupByAssociation1022() | |
| 967 { | |
| 968 ForEachProvider( | |
| 969 new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.Informix }, // Can be fixed. | |
| 970 db => AreEqual( | |
| 971 from ch in GrandChild1 | |
| 972 group ch by ch.Parent into g | |
| 973 where g.Count(_ => _.ChildID >= 20) > 2 && g.Where(_ => _.ChildID >= 19).Sum(p => p.ParentID) > 0 | |
| 974 select g.Key.Value1 | |
| 975 , | |
| 976 from ch in db.GrandChild1 | |
| 977 group ch by ch.Parent into g | |
| 978 where g.Count(_ => _.ChildID >= 20) > 2 && g.Where(_ => _.ChildID >= 19).Sum(p => p.ParentID) > 0 | |
| 979 select g.Key.Value1)); | |
| 980 } | |
| 981 | |
| 982 [Test] | |
| 983 public void GrooupByAssociation1023() | |
| 984 { | |
| 985 ForEachProvider( | |
| 986 new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.Informix }, // Can be fixed. | |
| 987 db => AreEqual( | |
| 988 from ch in GrandChild1 | |
| 989 group ch by ch.Parent into g | |
| 990 where | |
| 991 g.Count(_ => _.ChildID >= 20) > 2 && | |
| 992 g.Where(_ => _.ChildID >= 19).Sum(p => p.ParentID) > 0 && | |
| 993 g.Where(_ => _.ChildID >= 19).Max(p => p.ParentID) > 0 | |
| 994 select g.Key.Value1 | |
| 995 , | |
| 996 from ch in db.GrandChild1 | |
| 997 group ch by ch.Parent into g | |
| 998 where | |
| 999 g.Count(_ => _.ChildID >= 20) > 2 && | |
| 1000 g.Where(_ => _.ChildID >= 19).Sum(p => p.ParentID) > 0 && | |
| 1001 g.Where(_ => _.ChildID >= 19).Max(p => p.ParentID) > 0 | |
| 1002 select g.Key.Value1)); | |
| 1003 } | |
| 1004 | |
| 1005 [Test] | |
| 1006 public void GrooupByAssociation1024() | |
| 1007 { | |
| 1008 ForEachProvider( | |
| 1009 new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.Informix }, // Can be fixed. | |
| 1010 db => AreEqual( | |
| 1011 from ch in GrandChild1 | |
| 1012 group ch by ch.Parent into g | |
| 1013 where | |
| 1014 g.Count(_ => _.ChildID >= 20) > 2 && | |
| 1015 g.Where(_ => _.ChildID >= 19).Sum(p => p.ParentID) > 0 && | |
| 1016 g.Where(_ => _.ChildID >= 19).Max(p => p.ParentID) > 0 && | |
| 1017 g.Where(_ => _.ChildID >= 18).Max(p => p.ParentID) > 0 | |
| 1018 select g.Key.Value1 | |
| 1019 , | |
| 1020 from ch in db.GrandChild1 | |
| 1021 group ch by ch.Parent into g | |
| 1022 where | |
| 1023 g.Count(_ => _.ChildID >= 20) > 2 && | |
| 1024 g.Where(_ => _.ChildID >= 19).Sum(p => p.ParentID) > 0 && | |
| 1025 g.Where(_ => _.ChildID >= 19).Max(p => p.ParentID) > 0 && | |
| 1026 g.Where(_ => _.ChildID >= 18).Max(p => p.ParentID) > 0 | |
| 1027 select g.Key.Value1)); | |
| 1028 } | |
| 1029 | |
| 1030 [Test] | |
| 1031 public void GrooupByAssociation2() | |
| 1032 { | |
| 1033 ForEachProvider(db => AreEqual( | |
| 1034 from ch in GrandChild1 | |
| 1035 group ch by ch.Parent into g | |
| 1036 where g.Count() > 2 && g.Key.ParentID != 1 | |
| 1037 select g.Key.Value1 | |
| 1038 , | |
| 1039 from ch in db.GrandChild1 | |
| 1040 group ch by ch.Parent into g | |
| 1041 where g.Count() > 2 && g.Key.ParentID != 1 | |
| 1042 select g.Key.Value1)); | |
| 1043 } | |
| 1044 | |
| 1045 [Test] | |
| 1046 public void GrooupByAssociation3([IncludeDataContexts("Northwind")] string context) | |
| 1047 { | |
| 1048 using (var db = new NorthwindDB()) | |
| 1049 { | |
| 1050 var result = | |
| 1051 from p in db.Product | |
| 1052 group p by p.Category into g | |
| 1053 where g.Count() == 12 | |
| 1054 select g.Key.CategoryName; | |
| 1055 | |
| 1056 var list = result.ToList(); | |
| 1057 Assert.AreEqual(3, list.Count); | |
| 1058 } | |
| 1059 } | |
| 1060 | |
| 1061 [Test] | |
| 1062 public void GrooupByAssociation4([IncludeDataContexts("Northwind")] string context) | |
| 1063 { | |
| 1064 using (var db = new NorthwindDB()) | |
| 1065 { | |
| 1066 var result = | |
| 1067 from p in db.Product | |
| 1068 group p by p.Category into g | |
| 1069 where g.Count() == 12 | |
| 1070 select g.Key.CategoryID; | |
| 1071 | |
| 1072 var list = result.ToList(); | |
| 1073 Assert.AreEqual(3, list.Count); | |
| 1074 } | |
| 1075 } | |
| 1076 | |
| 1077 [Test] | |
| 1078 public void GroupByAggregate1() | |
| 1079 { | |
| 1080 var expected = | |
| 1081 from p in Parent | |
| 1082 group p by p.Children.Count > 0 && p.Children.Average(c => c.ParentID) > 3 into g | |
| 1083 select g.Key; | |
| 1084 | |
| 1085 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(expected, | |
| 1086 from p in db.Parent | |
| 1087 group p by p.Children.Average(c => c.ParentID) > 3 into g | |
| 1088 select g.Key)); | |
| 1089 } | |
| 1090 | |
| 1091 [Test] | |
| 1092 public void GroupByAggregate11() | |
| 1093 { | |
| 1094 var expected = | |
| 1095 from p in Parent | |
| 1096 where p.Children.Count > 0 | |
| 1097 group p by p.Children.Average(c => c.ParentID) > 3 into g | |
| 1098 select g.Key; | |
| 1099 | |
| 1100 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(expected, | |
| 1101 from p in db.Parent | |
| 1102 where p.Children.Count > 0 | |
| 1103 group p by p.Children.Average(c => c.ParentID) > 3 into g | |
| 1104 select g.Key)); | |
| 1105 } | |
| 1106 | |
| 1107 [Test] | |
| 1108 public void GroupByAggregate12() | |
| 1109 { | |
| 1110 var expected = | |
| 1111 from p in Parent | |
| 1112 group p by p.Children.Count > 0 && p.Children.Average(c => c.ParentID) > 3 into g | |
| 1113 select g.Key; | |
| 1114 | |
| 1115 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(expected, | |
| 1116 from p in db.Parent | |
| 1117 group p by p.Children.Count > 0 && p.Children.Average(c => c.ParentID) > 3 into g | |
| 1118 select g.Key)); | |
| 1119 } | |
| 1120 | |
| 1121 [Test] | |
| 1122 public void GroupByAggregate2([IncludeDataContexts("Northwind")] string context) | |
| 1123 { | |
| 1124 using (var db = new NorthwindDB()) | |
| 1125 AreEqual( | |
| 1126 ( | |
| 1127 from c in Customer | |
| 1128 group c by c.Orders.Count > 0 && c.Orders.Average(o => o.Freight) >= 80 | |
| 1129 ).ToList().Select(k => k.Key), | |
| 1130 ( | |
| 1131 from c in db.Customer | |
| 1132 group c by c.Orders.Average(o => o.Freight) >= 80 | |
| 1133 ).ToList().Select(k => k.Key)); | |
| 1134 } | |
| 1135 | |
| 1136 [Test] | |
| 1137 public void GroupByAggregate3() | |
| 1138 { | |
| 1139 var expected = | |
| 1140 ( | |
| 1141 from p in Parent | |
| 1142 group p by p.Children.Count > 0 && p.Children.Average(c => c.ParentID) > 3 | |
| 1143 ).ToList().First(g => !g.Key); | |
| 1144 | |
| 1145 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(expected, | |
| 1146 ( | |
| 1147 from p in db.Parent | |
| 1148 group p by p.Children.Average(c => c.ParentID) > 3 | |
| 1149 ).ToList().First(g => !g.Key))); | |
| 1150 } | |
| 1151 | |
| 1152 [Test] | |
| 1153 public void ByJoin() | |
| 1154 { | |
| 1155 ForEachProvider(db => AreEqual( | |
| 1156 from c1 in Child | |
| 1157 join c2 in Child on c1.ChildID equals c2.ChildID + 1 | |
| 1158 group c2 by c1.ParentID into g | |
| 1159 select g.Sum(_ => _.ChildID), | |
| 1160 from c1 in db.Child | |
| 1161 join c2 in db.Child on c1.ChildID equals c2.ChildID + 1 | |
| 1162 group c2 by c1.ParentID into g | |
| 1163 select g.Sum(_ => _.ChildID))); | |
| 1164 } | |
| 1165 | |
| 1166 [Test] | |
| 1167 public void SelectMany() | |
| 1168 { | |
| 1169 ForEachProvider(db => AreEqual( | |
| 1170 Child.GroupBy(ch => ch.ParentID).SelectMany(g => g), | |
| 1171 db.Child.GroupBy(ch => ch.ParentID).SelectMany(g => g))); | |
| 1172 } | |
| 1173 | |
| 1174 [Test] | |
| 1175 public void Scalar1() | |
| 1176 { | |
| 1177 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual( | |
| 1178 (from ch in Child | |
| 1179 group ch by ch.ParentID into g | |
| 1180 select g.Select(ch => ch.ChildID).Max()), | |
| 1181 (from ch in db.Child | |
| 1182 group ch by ch.ParentID into g | |
| 1183 select g.Select(ch => ch.ChildID).Max()))); | |
| 1184 } | |
| 1185 | |
| 1186 [Test] | |
| 1187 public void Scalar101() | |
| 1188 { | |
| 1189 ForEachProvider(db => AreEqual( | |
| 1190 (from ch in Child | |
| 1191 select ch.ChildID into id | |
| 1192 group id by id into g | |
| 1193 select g.Max()), | |
| 1194 (from ch in db.Child | |
| 1195 select ch.ChildID into id | |
| 1196 group id by id into g | |
| 1197 select g.Max()))); | |
| 1198 } | |
| 1199 | |
| 1200 [Test] | |
| 1201 public void Scalar2() | |
| 1202 { | |
| 1203 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual( | |
| 1204 (from ch in Child | |
| 1205 group ch by ch.ParentID into g | |
| 1206 select new | |
| 1207 { | |
| 1208 Max1 = g.Select(ch => ch.ChildID ).Max(), | |
| 1209 Max2 = g.Select(ch => ch.ChildID + ch.ParentID).Max() | |
| 1210 }), | |
| 1211 (from ch in db.Child | |
| 1212 group ch by ch.ParentID into g | |
| 1213 select new | |
| 1214 { | |
| 1215 Max1 = g.Select(ch => ch.ChildID ).Max(), | |
| 1216 Max2 = g.Select(ch => ch.ChildID + ch.ParentID).Max() | |
| 1217 }))); | |
| 1218 } | |
| 1219 | |
| 1220 [Test] | |
| 1221 public void Scalar3() | |
| 1222 { | |
| 1223 ForEachProvider( | |
| 1224 new[] { ProviderName.SqlCe }, | |
| 1225 db => AreEqual( | |
| 1226 (from ch in Child | |
| 1227 group ch by ch.ParentID into g | |
| 1228 select g.Select(ch => ch.ChildID).Where(id => id > 0).Max()), | |
| 1229 (from ch in db.Child | |
| 1230 group ch by ch.ParentID into g | |
| 1231 select g.Select(ch => ch.ChildID).Where(id => id > 0).Max()))); | |
| 1232 } | |
| 1233 | |
| 1234 [Test] | |
| 1235 public void Scalar4() | |
| 1236 { | |
| 1237 ForEachProvider( | |
| 1238 new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.Informix }, | |
| 1239 db => AreEqual( | |
| 1240 from ch in Child | |
| 1241 group ch by ch.ParentID into g | |
| 1242 where g.Where(ch => ch.ParentID > 2).Select(ch => (int?)ch.ChildID).Min() != null | |
| 1243 select g.Where(ch => ch.ParentID > 2).Select(ch => ch.ChildID).Min() | |
| 1244 , | |
| 1245 from ch in db.Child | |
| 1246 group ch by ch.ParentID into g | |
| 1247 where g.Where(ch => ch.ParentID > 2).Select(ch => (int?)ch.ChildID).Min() != null | |
| 1248 select g.Where(ch => ch.ParentID > 2).Select(ch => ch.ChildID).Min())); | |
| 1249 } | |
| 1250 | |
| 1251 [Test] | |
| 1252 public void Scalar41() | |
| 1253 { | |
| 1254 ForEachProvider( | |
| 1255 new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.Informix }, | |
| 1256 db => AreEqual( | |
| 1257 from ch in Child | |
| 1258 group ch by ch.ParentID into g | |
| 1259 select new { g } into g | |
| 1260 where g.g.Where(ch => ch.ParentID > 2).Select(ch => (int?)ch.ChildID).Min() != null | |
| 1261 select g.g.Where(ch => ch.ParentID > 2).Select(ch => ch.ChildID).Min() | |
| 1262 , | |
| 1263 from ch in db.Child | |
| 1264 group ch by ch.ParentID into g | |
| 1265 select new { g } into g | |
| 1266 where g.g.Where(ch => ch.ParentID > 2).Select(ch => (int?)ch.ChildID).Min() != null | |
| 1267 select g.g.Where(ch => ch.ParentID > 2).Select(ch => ch.ChildID).Min())); | |
| 1268 } | |
| 1269 | |
| 1270 [Test] | |
| 1271 public void Scalar5() | |
| 1272 { | |
| 1273 ForEachProvider(db => AreEqual( | |
| 1274 from ch in Child | |
| 1275 select ch.ParentID into id | |
| 1276 group id by id into g | |
| 1277 select g.Max() | |
| 1278 , | |
| 1279 from ch in db.Child | |
| 1280 select ch.ParentID into id | |
| 1281 group id by id into g | |
| 1282 select g.Max())); | |
| 1283 } | |
| 1284 | |
| 1285 //[Test] | |
| 1286 public void Scalar51() | |
| 1287 { | |
| 1288 ForEachProvider(db => AreEqual( | |
| 1289 from ch in Child | |
| 1290 group ch by ch.ParentID into g | |
| 1291 select g.Max() | |
| 1292 , | |
| 1293 from ch in db.Child | |
| 1294 group ch by ch.ParentID into g | |
| 1295 select g.Max())); | |
| 1296 } | |
| 1297 | |
| 1298 [Test] | |
| 1299 public void Scalar6() | |
| 1300 { | |
| 1301 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual( | |
| 1302 (from ch in Child | |
| 1303 where ch.ParentID < 3 | |
| 1304 group ch by ch.ParentID into g | |
| 1305 select g.Where(ch => ch.ParentID < 3).Max(ch => ch.ChildID)), | |
| 1306 (from ch in db.Child | |
| 1307 where ch.ParentID < 3 | |
| 1308 group ch by ch.ParentID into g | |
| 1309 select g.Where(ch => ch.ParentID < 3).Max(ch => ch.ChildID)))); | |
| 1310 } | |
| 1311 | |
| 1312 [Test] | |
| 1313 public void Scalar7() | |
| 1314 { | |
| 1315 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual( | |
| 1316 (from ch in Child | |
| 1317 group ch by ch.ParentID into g | |
| 1318 select new { max = g.Select(ch => ch.ChildID).Max()}).Select(id => id.max), | |
| 1319 (from ch in db.Child | |
| 1320 group ch by ch.ParentID into g | |
| 1321 select new { max = g.Select(ch => ch.ChildID).Max()}).Select(id => id.max))); | |
| 1322 } | |
| 1323 | |
| 1324 [Test] | |
| 1325 public void Scalar8() | |
| 1326 { | |
| 1327 ForEachProvider(db => AreEqual( | |
| 1328 (from ch in Child | |
| 1329 group ch by ch.ParentID into g | |
| 1330 select new { max = g.Max(ch => ch.ChildID)}).Select(id => id.max), | |
| 1331 (from ch in db.Child | |
| 1332 group ch by ch.ParentID into g | |
| 1333 select new { max = g.Max(ch => ch.ChildID)}).Select(id => id.max))); | |
| 1334 } | |
| 1335 | |
| 1336 [Test] | |
| 1337 public void Scalar9() | |
| 1338 { | |
| 1339 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual( | |
| 1340 (from ch in Child | |
| 1341 group ch by ch.ParentID into g | |
| 1342 select g.Select(ch => ch.ChildID).Where(id => id < 30).Count()), | |
| 1343 (from ch in db.Child | |
| 1344 group ch by ch.ParentID into g | |
| 1345 select g.Select(ch => ch.ChildID).Where(id => id < 30).Count()))); | |
| 1346 } | |
| 1347 | |
| 1348 [Test] | |
| 1349 public void Scalar10() | |
| 1350 { | |
| 1351 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual( | |
| 1352 (from ch in Child | |
| 1353 group ch by ch.ParentID into g | |
| 1354 select g.Select(ch => ch.ChildID).Where(id => id < 30).Count(id => id >= 20)), | |
| 1355 (from ch in db.Child | |
| 1356 group ch by ch.ParentID into g | |
| 1357 select g.Select(ch => ch.ChildID).Where(id => id < 30).Count(id => id >= 20)))); | |
| 1358 } | |
| 1359 | |
| 1360 [Test, Category("MySql")] | |
| 1361 public void GroupByExtraFieldBugTest([IncludeDataContexts(ProviderName.MySql)] string context) | |
| 1362 { | |
| 1363 // https://github.com/igor-tkachev/bltoolkit/issues/42 | |
| 1364 // extra field is generated in the GROUP BY clause, for example: | |
| 1365 // GROUP BY p.LastName, p.LastName <--- the second one is redundant | |
| 1366 | |
| 1367 using (var db = new TestDbManager(context)) | |
| 1368 { | |
| 1369 var q = | |
| 1370 from d in db.Doctor | |
| 1371 join p in db.Person on d.PersonID equals p.ID | |
| 1372 group d by p.LastName into g | |
| 1373 select g.Key; | |
| 1374 | |
| 1375 q.ToList(); | |
| 1376 | |
| 1377 const string fieldName = "LastName"; | |
| 1378 | |
| 1379 var lastQuery = db.LastQuery; | |
| 1380 var groupByPos = lastQuery.IndexOf("GROUP BY"); | |
| 1381 var fieldPos = lastQuery.IndexOf(fieldName, groupByPos); | |
| 1382 | |
| 1383 // check that our field does not present in the GROUP BY clause second time | |
| 1384 Assert.AreEqual(-1, lastQuery.IndexOf(fieldName, fieldPos + 1)); | |
| 1385 } | |
| 1386 } | |
| 1387 | |
| 1388 [Test] | |
| 1389 public void DoubleGroupBy1() | |
| 1390 { | |
| 1391 ForEachProvider( | |
| 1392 db => AreEqual( | |
| 1393 from t in | |
| 1394 from p in Parent | |
| 1395 where p.Value1 != null | |
| 1396 group p by p.ParentID into g | |
| 1397 select new | |
| 1398 { | |
| 1399 ID = g.Key, | |
| 1400 Max = g.Max(t => t.Value1) | |
| 1401 } | |
| 1402 group t by t.ID into g | |
| 1403 select new | |
| 1404 { | |
| 1405 g.Key, | |
| 1406 Sum = g.Sum(t => t.Max) | |
| 1407 }, | |
| 1408 from t in | |
| 1409 from p in db.Parent | |
| 1410 where p.Value1 != null | |
| 1411 group p by p.ParentID into g | |
| 1412 select new | |
| 1413 { | |
| 1414 ID = g.Key, | |
| 1415 Max = g.Max(t => t.Value1) | |
| 1416 } | |
| 1417 group t by t.ID into g | |
| 1418 select new | |
| 1419 { | |
| 1420 g.Key, | |
| 1421 Sum = g.Sum(t => t.Max) | |
| 1422 })); | |
| 1423 | |
| 1424 } | |
| 1425 | |
| 1426 [Test] | |
| 1427 public void DoubleGroupBy2() | |
| 1428 { | |
| 1429 ForEachProvider( | |
| 1430 db => AreEqual( | |
| 1431 from p in Parent | |
| 1432 where p.Value1 != null | |
| 1433 group p by p.ParentID into g | |
| 1434 select new | |
| 1435 { | |
| 1436 ID = g.Key, | |
| 1437 Max = g.Max(t => t.Value1) | |
| 1438 } into t | |
| 1439 group t by t.ID into g | |
| 1440 select new | |
| 1441 { | |
| 1442 g.Key, | |
| 1443 Sum = g.Sum(t => t.Max) | |
| 1444 }, | |
| 1445 from p in db.Parent | |
| 1446 where p.Value1 != null | |
| 1447 group p by p.ParentID into g | |
| 1448 select new | |
| 1449 { | |
| 1450 ID = g.Key, | |
| 1451 Max = g.Max(t => t.Value1) | |
| 1452 } into t | |
| 1453 group t by t.ID into g | |
| 1454 select new | |
| 1455 { | |
| 1456 g.Key, | |
| 1457 Sum = g.Sum(t => t.Max) | |
| 1458 })); | |
| 1459 | |
| 1460 } | |
| 1461 | |
| 1462 [Test] | |
| 1463 public void InnerQuery([DataContexts(ProviderName.SqlCe)] string context) | |
| 1464 { | |
| 1465 using (var db = GetDataContext(context)) | |
| 1466 { | |
| 1467 AreEqual( | |
| 1468 Doctor.GroupBy(s => s.PersonID).Select(s => s.Select(d => d.Taxonomy).First()), | |
| 1469 db.Doctor.GroupBy(s => s.PersonID).Select(s => s.Select(d => d.Taxonomy).First())); | |
| 1470 } | |
| 1471 } | |
| 1472 | |
| 1473 [Test] | |
| 1474 public void CalcMember([DataContexts] string context) | |
| 1475 { | |
| 1476 using (var db = GetDataContext(context)) | |
| 1477 { | |
| 1478 AreEqual( | |
| 1479 from parent in Parent | |
| 1480 from child in Person | |
| 1481 where child.ID == parent.ParentID | |
| 1482 let data = new | |
| 1483 { | |
| 1484 parent.Value1, | |
| 1485 Value = child.FirstName == "John" ? child.FirstName : "a" | |
| 1486 } | |
| 1487 group data by data.Value into groupedData | |
| 1488 select new | |
| 1489 { | |
| 1490 groupedData.Key, | |
| 1491 Count = groupedData.Count() | |
| 1492 }, | |
| 1493 from parent in db.Parent | |
| 1494 from child in db.Person | |
| 1495 where child.ID == parent.ParentID | |
| 1496 let data = new | |
| 1497 { | |
| 1498 parent.Value1, | |
| 1499 Value = child.FirstName == "John" ? child.FirstName : "a" | |
| 1500 } | |
| 1501 group data by data.Value into groupedData | |
| 1502 select new | |
| 1503 { | |
| 1504 groupedData.Key, | |
| 1505 Count = groupedData.Count() | |
| 1506 }); | |
| 1507 } | |
| 1508 } | |
| 1509 | |
| 1510 [Test] | |
| 1511 public void GroupByDate([DataContexts] string context) | |
| 1512 { | |
| 1513 using (var db = GetDataContext(context)) | |
| 1514 { | |
| 1515 AreEqual( | |
| 1516 from t in Types2 | |
| 1517 group t by new { t.DateTimeValue.Value.Month, t.DateTimeValue.Value.Year } into grp | |
| 1518 select new | |
| 1519 { | |
| 1520 Total = grp.Sum(_ => _.MoneyValue), | |
| 1521 year = grp.Key.Year, | |
| 1522 month = grp.Key.Month | |
| 1523 }, | |
| 1524 from t in db.Types2 | |
| 1525 group t by new { t.DateTimeValue.Value.Month, t.DateTimeValue.Value.Year } into grp | |
| 1526 select new | |
| 1527 { | |
| 1528 Total = grp.Sum(_ => _.MoneyValue), | |
| 1529 year = grp.Key.Year, | |
| 1530 month = grp.Key.Month | |
| 1531 }); | |
| 1532 } | |
| 1533 } | |
| 1534 } | |
| 1535 } |
