Mercurial > pub > bltoolkit
comparison UnitTests/Linq/IdlTest.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.Collections.Generic; | |
| 3 using System.Linq; | |
| 4 using System.Linq.Expressions; | |
| 5 using BLToolkit.Data.DataProvider; | |
| 6 using BLToolkit.Data.Linq; | |
| 7 using BLToolkit.Data.Sql.SqlProvider; | |
| 8 using BLToolkit.DataAccess; | |
| 9 using BLToolkit.Mapping; | |
| 10 using Data.Linq.Model; | |
| 11 using NUnit.Framework; | |
| 12 | |
| 13 namespace Data.Linq | |
| 14 { | |
| 15 [TestFixture] | |
| 16 public partial class IdlTest : TestBase | |
| 17 { | |
| 18 class IdlProvidersAttribute : IncludeDataContextsAttribute | |
| 19 { | |
| 20 public IdlProvidersAttribute() | |
| 21 : base(ProviderName.SQLite, ProviderName.MySql, "Sql2005", "Sql2008") | |
| 22 { | |
| 23 } | |
| 24 } | |
| 25 | |
| 26 private void ForProvider(string providerName, Action<ITestDataContext> func) | |
| 27 { | |
| 28 ForEachProvider(Providers.Select(p => p.Name).Except(new[] { providerName }).ToArray(), func); | |
| 29 } | |
| 30 | |
| 31 private void ForMySqlProvider(Action<ITestDataContext> func) | |
| 32 { | |
| 33 ForEachProvider(Providers.Select(p => p.Name).Except(new[] { ProviderName.MySql }).ToArray(), func); | |
| 34 } | |
| 35 | |
| 36 #region PersonWithId | |
| 37 | |
| 38 public interface IHasID | |
| 39 { | |
| 40 int ID { get; set; } | |
| 41 } | |
| 42 | |
| 43 [TableName(Name = "Person")] | |
| 44 public class PersonWithId : IHasID | |
| 45 { | |
| 46 public PersonWithId() | |
| 47 { | |
| 48 } | |
| 49 | |
| 50 public PersonWithId(int id) | |
| 51 { | |
| 52 ID = id; | |
| 53 } | |
| 54 | |
| 55 public PersonWithId(int id, string firstName) | |
| 56 { | |
| 57 ID = id; | |
| 58 FirstName = firstName; | |
| 59 } | |
| 60 | |
| 61 [Identity, PrimaryKey] | |
| 62 [SequenceName("Firebird", "PersonID")] | |
| 63 [MapField("PersonID")] | |
| 64 public int ID { get; set; } | |
| 65 public string FirstName { get; set; } | |
| 66 public string LastName; | |
| 67 [Nullable] public string MiddleName; | |
| 68 public Gender Gender; | |
| 69 | |
| 70 [MapIgnore] | |
| 71 public string Name | |
| 72 { | |
| 73 get { return FirstName + " " + LastName; } | |
| 74 } | |
| 75 | |
| 76 public override bool Equals(object obj) | |
| 77 { | |
| 78 return Equals(obj as PersonWithId); | |
| 79 } | |
| 80 | |
| 81 public bool Equals(PersonWithId other) | |
| 82 { | |
| 83 if (ReferenceEquals(null, other)) return false; | |
| 84 if (ReferenceEquals(this, other)) return true; | |
| 85 return | |
| 86 other.ID == ID && | |
| 87 Equals(other.LastName, LastName) && | |
| 88 Equals(other.MiddleName, MiddleName) && | |
| 89 other.Gender == Gender && | |
| 90 Equals(other.FirstName, FirstName); | |
| 91 } | |
| 92 | |
| 93 public override int GetHashCode() | |
| 94 { | |
| 95 unchecked | |
| 96 { | |
| 97 var result = ID; | |
| 98 result = (result * 397) ^ (LastName != null ? LastName.GetHashCode() : 0); | |
| 99 result = (result * 397) ^ (MiddleName != null ? MiddleName.GetHashCode() : 0); | |
| 100 result = (result * 397) ^ Gender.GetHashCode(); | |
| 101 result = (result * 397) ^ (FirstName != null ? FirstName.GetHashCode() : 0); | |
| 102 return result; | |
| 103 } | |
| 104 } | |
| 105 } | |
| 106 | |
| 107 #endregion | |
| 108 | |
| 109 #region ObjectId | |
| 110 | |
| 111 public interface IHasObjectId2 | |
| 112 { | |
| 113 ObjectId Id { get; set; } | |
| 114 } | |
| 115 | |
| 116 public interface IHasObjectId1 | |
| 117 { | |
| 118 ObjectId Id { get; set; } | |
| 119 } | |
| 120 | |
| 121 public struct ObjectId | |
| 122 { | |
| 123 public ObjectId(int value) | |
| 124 { | |
| 125 m_value = value; | |
| 126 } | |
| 127 | |
| 128 private int m_value; | |
| 129 | |
| 130 public int Value | |
| 131 { | |
| 132 get { return m_value; } | |
| 133 set { m_value = value; } | |
| 134 } | |
| 135 | |
| 136 public static implicit operator int(ObjectId val) | |
| 137 { | |
| 138 return val.m_value; | |
| 139 } | |
| 140 } | |
| 141 | |
| 142 public class WithObjectIdBase : IHasObjectId1 | |
| 143 { | |
| 144 public ObjectId Id { get; set; } | |
| 145 } | |
| 146 | |
| 147 public class PersonWithObjectId : WithObjectIdBase, IHasObjectId2 | |
| 148 { | |
| 149 public string FistName { get; set; } | |
| 150 } | |
| 151 | |
| 152 public struct NullableObjectId | |
| 153 { | |
| 154 public NullableObjectId(int? value) | |
| 155 { | |
| 156 m_value = value; | |
| 157 } | |
| 158 | |
| 159 private int? m_value; | |
| 160 | |
| 161 public int? Value | |
| 162 { | |
| 163 get { return m_value; } | |
| 164 set { m_value = value; } | |
| 165 } | |
| 166 | |
| 167 public static implicit operator int?(NullableObjectId val) | |
| 168 { | |
| 169 return val.m_value; | |
| 170 } | |
| 171 } | |
| 172 | |
| 173 #endregion | |
| 174 | |
| 175 [Test] | |
| 176 public void TestComplexExpression([IdlProviders] string providerName) | |
| 177 { | |
| 178 // failed with BLToolkit.Data.Linq.LinqException : 'new StationObjectId() {Value = ConvertNullable(child.ChildID)}' | |
| 179 // cannot be converted to SQL. | |
| 180 ForProvider( | |
| 181 providerName, | |
| 182 db => | |
| 183 { | |
| 184 var source = from child in db.GrandChild | |
| 185 select | |
| 186 new | |
| 187 { | |
| 188 NullableId = new NullableObjectId { Value = child.ChildID } | |
| 189 }; | |
| 190 | |
| 191 var query = from e in source where e.NullableId == 1 select e; | |
| 192 | |
| 193 var result = query.ToArray(); | |
| 194 Assert.That(result, Is.Not.Null); | |
| 195 }); | |
| 196 } | |
| 197 | |
| 198 [Test] | |
| 199 public void TestJoin([IdlProviders] string providerName) | |
| 200 { | |
| 201 // failed with System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than | |
| 202 // the size of the collection. | |
| 203 // Parameter name: index | |
| 204 ForProvider( | |
| 205 providerName, | |
| 206 db => | |
| 207 { | |
| 208 var source = from p1 in db.Person | |
| 209 join p2 in db.Person on p1.ID equals p2.ID | |
| 210 select | |
| 211 new { ID1 = new ObjectId { Value = p1.ID }, FirstName2 = p2.FirstName, }; | |
| 212 | |
| 213 var query = from p1 in source select p1.ID1.Value; | |
| 214 | |
| 215 var result = query.ToArray(); | |
| 216 Assert.That(result, Is.Not.Null); | |
| 217 }); | |
| 218 } | |
| 219 | |
| 220 [Test] | |
| 221 public void TestNullableExpression([IdlProviders] string providerName) | |
| 222 { | |
| 223 // failed with System.NullReferenceException : Object reference not set to an instance of an object. | |
| 224 ForProvider( | |
| 225 providerName, | |
| 226 db => | |
| 227 { | |
| 228 var source = from obj in db.Person select new { Id = obj.ID, }; | |
| 229 | |
| 230 // fails for bool?, double?, int32?, int64?, string | |
| 231 // works for byte?, int16?, DateTime? | |
| 232 double? @p1 = null; | |
| 233 | |
| 234 var r = from c in source where @p1 != null select c; | |
| 235 | |
| 236 Assert.That(r.ToArray(), Is.Not.Null); | |
| 237 }); | |
| 238 } | |
| 239 | |
| 240 [Test] | |
| 241 public void TestLookupWithInterfaceProperty([IdlProviders] string providerName) | |
| 242 { | |
| 243 ForProvider( | |
| 244 providerName, | |
| 245 db => | |
| 246 { | |
| 247 var r = GetById<PersonWithId>(db, 1).SingleOrDefault(); | |
| 248 Assert.That(r, Is.Not.Null); | |
| 249 }); | |
| 250 } | |
| 251 | |
| 252 #region ObjectExt | |
| 253 | |
| 254 public abstract class ObjectWithId | |
| 255 { | |
| 256 public ObjectId Id; | |
| 257 } | |
| 258 | |
| 259 public class ParentEx : ObjectWithId | |
| 260 { | |
| 261 public int? Value1; | |
| 262 } | |
| 263 | |
| 264 #endregion | |
| 265 | |
| 266 [Test] | |
| 267 public void TestForObjectExt([IdlProviders] string providerName) | |
| 268 { | |
| 269 ForProvider( | |
| 270 providerName, | |
| 271 db => | |
| 272 { | |
| 273 var r = from p in db.Parent | |
| 274 select new ParentEx | |
| 275 { | |
| 276 Id = new ObjectId { Value = p.ParentID }, | |
| 277 Value1 = p.Value1, | |
| 278 }; | |
| 279 Assert.That(r.ToArray(), Is.Not.Null); | |
| 280 }); | |
| 281 } | |
| 282 | |
| 283 private void getData(ITestDataContext db, IEnumerable<int?> d, IEnumerable<int?> compareWith) | |
| 284 { | |
| 285 var r1 = db.GrandChild | |
| 286 .Where(x => d.Contains(x.ParentID)) | |
| 287 .GroupBy(x => x.ChildID, x => x.GrandChildID) | |
| 288 .ToList(); | |
| 289 foreach (var group in r1) | |
| 290 { | |
| 291 Assert.That(compareWith.Any(x => group.Contains(x)), Is.True); | |
| 292 } | |
| 293 } | |
| 294 | |
| 295 [Test] | |
| 296 public void TestForGroupBy([IdlProviders] string providerName) | |
| 297 { | |
| 298 ForProvider( | |
| 299 providerName, | |
| 300 db => | |
| 301 { | |
| 302 /* no error in first call */ | |
| 303 getData(db, new List<int?> { 2 }, new List<int?> { 211, 212, 221, 222 }); | |
| 304 | |
| 305 /* error in second and more calls */ | |
| 306 /* | |
| 307 * GROUP BY select clause is correct | |
| 308 SELECT x.ChildID FROM GrandChild x WHERE x.ParentID IN (3) GROUP BY x.ChildID | |
| 309 | |
| 310 * But next SELECT clause contains "x.ParentID IN (2)" instead "x.ParentID IN (3)" | |
| 311 -- DECLARE ?p1 Int32 | |
| 312 -- SET ?p1 = 31 | |
| 313 SELECT x.GrandChildID FROM GrandChild x WHERE x.ParentID IN (2) AND x.ChildID = ?p1 | |
| 314 */ | |
| 315 getData(db, new List<int?> { 3 }, new List<int?> { 311, 312, 313, 321, 333 }); | |
| 316 }); | |
| 317 } | |
| 318 | |
| 319 [Test] | |
| 320 public void TestLinqMax([IdlProviders] string providerName) | |
| 321 { | |
| 322 ForProvider( | |
| 323 providerName, | |
| 324 db => | |
| 325 { | |
| 326 Assert.That(db.Patient.Where(x => x.PersonID < 0).Select(x => (int?)x.PersonID).Max(), Is.Null); | |
| 327 Assert.That(db.Patient.Where(x => x.PersonID < 0).Max(x => (int?)x.PersonID), Is.Null); | |
| 328 Assert.Catch<InvalidOperationException>( | |
| 329 () => db.Patient.Where(x => x.PersonID < 0).Select(x => x.PersonID).Max()); | |
| 330 Assert.Catch<InvalidOperationException>( | |
| 331 () => db.Patient.Where(x => x.PersonID < 0).Max(x => x.PersonID)); | |
| 332 }); | |
| 333 } | |
| 334 | |
| 335 [Test] | |
| 336 public void TestConvertFunction([IdlProviders] string providerName) | |
| 337 { | |
| 338 ForProvider( | |
| 339 providerName, | |
| 340 db => | |
| 341 { | |
| 342 var ds = new IdlPatientSource(db); | |
| 343 var r1 = ds.Patients().ToList(); | |
| 344 var r2 = ds.Persons().ToList(); | |
| 345 | |
| 346 Assert.That(r1, Is.Not.Empty); | |
| 347 Assert.That(r2, Is.Not.Empty); | |
| 348 | |
| 349 var r3 = ds.Patients().ToIdlPatientEx(ds); | |
| 350 var r4 = r3.ToList(); | |
| 351 Assert.That(r4, Is.Not.Empty); | |
| 352 }); | |
| 353 } | |
| 354 | |
| 355 [Test] | |
| 356 public void TestJoinOrder([IdlProviders] string providerName) | |
| 357 { | |
| 358 ForProvider( | |
| 359 providerName, | |
| 360 db => | |
| 361 { | |
| 362 var source = new IdlPatientSource(db); | |
| 363 | |
| 364 // Success when use result from second JOIN | |
| 365 var query1 = from p1 in source.GrandChilds() | |
| 366 join p2 in source.Persons() on p1.ParentID equals p2.Id | |
| 367 join p3 in source.Persons() on p1.ChildID equals p3.Id | |
| 368 select | |
| 369 new | |
| 370 { | |
| 371 p1.ChildID, | |
| 372 p1.ParentID, | |
| 373 //Parent = p2, | |
| 374 Child = p3, | |
| 375 }; | |
| 376 var data1 = query1.ToList(); | |
| 377 | |
| 378 // Fail when use result from first JOIN | |
| 379 var query2 = from p1 in source.GrandChilds() | |
| 380 join p2 in source.Persons() on p1.ParentID equals p2.Id | |
| 381 join p3 in source.Persons() on p1.ChildID equals p3.Id | |
| 382 select | |
| 383 new | |
| 384 { | |
| 385 p1.ChildID, | |
| 386 p1.ParentID, | |
| 387 Parent = p2, | |
| 388 //Child = p3, | |
| 389 }; | |
| 390 var data2 = query2.ToList(); | |
| 391 }); | |
| 392 } | |
| 393 | |
| 394 [Test] | |
| 395 public void TestDistinctWithGroupBy([IdlProviders] string providerName) | |
| 396 { | |
| 397 ForProvider( | |
| 398 providerName, | |
| 399 db => | |
| 400 { | |
| 401 const int parentId = 10000; | |
| 402 db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = 1 }); | |
| 403 db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = 1 }); | |
| 404 | |
| 405 try | |
| 406 { | |
| 407 var source = db.Parent.ToList(); | |
| 408 | |
| 409 // Success when query is executed in memory | |
| 410 TestDistinctWithGroupBy(source.AsQueryable()); | |
| 411 | |
| 412 // Failed when query is executed on sql server | |
| 413 TestDistinctWithGroupBy(db.Parent); | |
| 414 } | |
| 415 finally | |
| 416 { | |
| 417 db.Parent.Delete(x => x.ParentID == parentId); | |
| 418 } | |
| 419 }); | |
| 420 } | |
| 421 | |
| 422 private static void TestDistinctWithGroupBy(IQueryable<Parent> source) | |
| 423 { | |
| 424 const int score = 4; | |
| 425 var q = source.Select(x => new { Key = x.Value1, MatchScore = score }) | |
| 426 .Distinct(); | |
| 427 var qq = q.GroupBy( | |
| 428 x => x.Key, | |
| 429 (key, x) => new { Id = key, MatchScore = x.Sum(y => y.MatchScore) }) | |
| 430 .Select(x => new { x.Id, x.MatchScore }); | |
| 431 | |
| 432 var result = qq.ToList(); | |
| 433 Assert.That(result.Select(x => x.MatchScore), Is.All.EqualTo(score)); | |
| 434 } | |
| 435 | |
| 436 private static IQueryable<T> GetById<T>(ITestDataContext db, int id) where T : class, IHasID | |
| 437 { | |
| 438 return db.GetTable<T>().Where(obj => obj.ID == id); | |
| 439 } | |
| 440 | |
| 441 [Test] | |
| 442 public void ImplicitCastTest([IdlProviders] string providerName) | |
| 443 { | |
| 444 ForProvider( | |
| 445 providerName, | |
| 446 db => | |
| 447 { | |
| 448 var people = | |
| 449 from p in db.Person | |
| 450 select new IdlPerson | |
| 451 { | |
| 452 Id = new ObjectId { Value = p.ID }, | |
| 453 Name = p.FirstName | |
| 454 }; | |
| 455 | |
| 456 var sql1 = (from p in people where p.Id == 1 select p).ToString(); | |
| 457 var sql2 = (from p in people where p.Id.Value == 1 select p).ToString(); | |
| 458 | |
| 459 Assert.That(sql1, Is.EqualTo(sql2)); | |
| 460 }); | |
| 461 } | |
| 462 | |
| 463 [Test] | |
| 464 public void ListvsArrayTest([IdlProviders] string providerName) | |
| 465 { | |
| 466 ForProvider( | |
| 467 providerName, | |
| 468 db => | |
| 469 { | |
| 470 var st = "John"; | |
| 471 | |
| 472 //SQL - x.FirstName IN ('John') | |
| 473 var queryList = from x in db.Person | |
| 474 where new List<string> { st }.Contains(x.FirstName) | |
| 475 select x.ID; | |
| 476 | |
| 477 //SQL - x.FirstName IN ('J', 'o', 'h', 'n') | |
| 478 var queryArray = from x in db.Person | |
| 479 where new[] { st }.Contains(x.FirstName) | |
| 480 select x.ID; | |
| 481 | |
| 482 Assert.That(queryList.ToList(), Is.EqualTo(queryArray.ToList())); | |
| 483 }); | |
| 484 } | |
| 485 | |
| 486 [Test] | |
| 487 public void ConcatJoinOrderByTest([IdlProviders] string providerName) | |
| 488 { | |
| 489 ForProvider( | |
| 490 providerName, | |
| 491 db => | |
| 492 { | |
| 493 var query = from y in | |
| 494 ((from pat in db.Patient | |
| 495 where pat.Diagnosis == "a" | |
| 496 select pat) | |
| 497 .Concat | |
| 498 ( | |
| 499 from pat in db.Patient | |
| 500 where pat.Diagnosis == "b" | |
| 501 select pat)) | |
| 502 join person in db.Person on y.PersonID equals person.ID | |
| 503 orderby person.ID | |
| 504 select new { Id = person.ID, Id2 = y.PersonID }; | |
| 505 | |
| 506 Assert.That(query.ToList(), Is.Not.Null); | |
| 507 }); | |
| 508 } | |
| 509 | |
| 510 [Test] | |
| 511 public void TestIsContainedInArrayOfEnumValues([IdlProviders] string providerName) | |
| 512 { | |
| 513 var types2 = new[] { TypeValue.Value2, TypeValue.Value3, TypeValue.Value4 }; | |
| 514 | |
| 515 ForProvider( | |
| 516 providerName, | |
| 517 db => | |
| 518 { | |
| 519 var result = (from x in db.Parent4 where types2.Contains(x.Value1) select x) | |
| 520 .ToList(); | |
| 521 | |
| 522 Assert.That(result, Is.Not.Null); | |
| 523 }); | |
| 524 } | |
| 525 | |
| 526 [Test] | |
| 527 public void TestQueryWithInterface([IdlProviders] string providerName) | |
| 528 { | |
| 529 ForProvider( | |
| 530 providerName, | |
| 531 db => | |
| 532 { | |
| 533 var persons = | |
| 534 from x in db.Person | |
| 535 select new PersonWithObjectId | |
| 536 { | |
| 537 Id = new ObjectId { Value = x.ID }, | |
| 538 FistName = x.FirstName, | |
| 539 }; | |
| 540 | |
| 541 // this works | |
| 542 var r1 = FilterSourceByIdDefinedInBaseClass(persons, 5).ToArray(); | |
| 543 Assert.That(r1, Is.Not.Null); | |
| 544 | |
| 545 // and this works | |
| 546 var r2 = FilterSourceByIdDefinedInInterface1(persons, 5).ToArray(); | |
| 547 Assert.That(r2, Is.Not.Null); | |
| 548 | |
| 549 // but this fails | |
| 550 var r3 = FilterSourceByIdDefinedInInterface2(persons, 5).ToArray(); | |
| 551 Assert.That(r3, Is.Not.Null); | |
| 552 }); | |
| 553 } | |
| 554 | |
| 555 [Test] | |
| 556 public void TestBugCountWithOrderBy([IdlProviders] string providerName) | |
| 557 { | |
| 558 ForProvider( | |
| 559 providerName, | |
| 560 db => | |
| 561 { | |
| 562 var q1 = db.Person.OrderBy(x => x.ID); | |
| 563 | |
| 564 var q2 = from p in q1 | |
| 565 join p2 in db.Person on p.ID equals p2.ID | |
| 566 select p2; | |
| 567 | |
| 568 Assert.DoesNotThrow(() => q2.Max(x => x.ID)); | |
| 569 Assert.DoesNotThrow(() => q2.Count()); | |
| 570 }); | |
| 571 } | |
| 572 | |
| 573 [Test] | |
| 574 public void TestUpdateWithTargetByAssociationProperty([IdlProviders] string providerName) | |
| 575 { | |
| 576 TestUpdateByAssociationProperty(providerName, true); | |
| 577 } | |
| 578 | |
| 579 [Test] | |
| 580 public void TestSetUpdateWithoutTargetByAssociationProperty([IdlProviders] string providerName) | |
| 581 { | |
| 582 TestUpdateByAssociationProperty(providerName, false); | |
| 583 } | |
| 584 | |
| 585 private void TestUpdateByAssociationProperty(string providerName, bool useUpdateWithTarget) | |
| 586 { | |
| 587 ForProvider( | |
| 588 providerName, | |
| 589 db => | |
| 590 { | |
| 591 const int childId = 10000; | |
| 592 const int parentId = 20000; | |
| 593 | |
| 594 try | |
| 595 { | |
| 596 db.Parent.Insert(() => new Parent { ParentID = parentId }); | |
| 597 db.Child.Insert(() => new Child { ChildID = childId, ParentID = parentId }); | |
| 598 | |
| 599 var parents = from child in db.Child | |
| 600 where child.ChildID == childId | |
| 601 select child.Parent; | |
| 602 | |
| 603 if (useUpdateWithTarget) | |
| 604 { | |
| 605 // this failed for MySql and SQLite but works with MS SQL | |
| 606 Assert.DoesNotThrow(() => parents.Update(db.Parent, x => new Parent { Value1 = 5 })); | |
| 607 } | |
| 608 else | |
| 609 { | |
| 610 // this works with MySql but failed for SQLite and MS SQL | |
| 611 Assert.DoesNotThrow(() => parents.Set(x => x.Value1, 5).Update()); | |
| 612 } | |
| 613 } | |
| 614 finally | |
| 615 { | |
| 616 db.Child.Delete(x => x.ChildID == childId); | |
| 617 db.Parent.Delete(x => x.ParentID == parentId); | |
| 618 } | |
| 619 }); | |
| 620 } | |
| 621 | |
| 622 | |
| 623 private IQueryable<T> FilterSourceByIdDefinedInBaseClass<T>(IQueryable<T> source, int id) | |
| 624 where T : WithObjectIdBase | |
| 625 { | |
| 626 return from x in source where x.Id == id select x; | |
| 627 } | |
| 628 | |
| 629 private IQueryable<T> FilterSourceByIdDefinedInInterface1<T>(IQueryable<T> source, int id) | |
| 630 where T : IHasObjectId1 | |
| 631 { | |
| 632 return from x in source where x.Id == id select x; | |
| 633 } | |
| 634 | |
| 635 private IQueryable<T> FilterSourceByIdDefinedInInterface2<T>(IQueryable<T> source, int id) | |
| 636 where T : IHasObjectId2 | |
| 637 { | |
| 638 return from x in source where x.Id == id select x; | |
| 639 } | |
| 640 | |
| 641 [Test] | |
| 642 public void TestComparePropertyOfEnumTypeToVaribleInSubquery([IdlProviders] string providerName) | |
| 643 { | |
| 644 ForProvider( | |
| 645 providerName, | |
| 646 db => | |
| 647 { | |
| 648 var gender = Gender.Other; | |
| 649 var q = from x in db.Patient | |
| 650 join y in db.Person.Where(x => x.Gender == gender) on x.PersonID equals y.ID | |
| 651 select x; | |
| 652 | |
| 653 var r = q.ToList(); | |
| 654 Assert.That(r, Is.Not.Null); | |
| 655 }); | |
| 656 } | |
| 657 | |
| 658 [Test] | |
| 659 public void ConcatOrderByTest([IdlProviders] string providerName) | |
| 660 { | |
| 661 ForProvider( | |
| 662 providerName, | |
| 663 db => | |
| 664 { | |
| 665 var q = from p in db.Person | |
| 666 where p.ID < 0 | |
| 667 select new { Rank = 0, FirstName = (string)null, LastName = (string)null }; | |
| 668 var q2 = | |
| 669 q.Concat( | |
| 670 from p in db.Person | |
| 671 select new { Rank = p.ID, p.FirstName, p.LastName }); | |
| 672 | |
| 673 var resultquery = (from x in q2 orderby x.Rank, x.FirstName, x.LastName select x).ToString(); | |
| 674 | |
| 675 var rqr = resultquery.LastIndexOf( | |
| 676 "ORDER BY", System.StringComparison.InvariantCultureIgnoreCase); | |
| 677 var rqp = | |
| 678 (resultquery.Substring(rqr + "ORDER BY".Length).Split(',')).Select(p => p.Trim()).ToArray(); | |
| 679 | |
| 680 Assert.That(rqp.Count(), Is.EqualTo(3)); | |
| 681 }); | |
| 682 } | |
| 683 | |
| 684 [Test] | |
| 685 public void TestContainsForNullableDateTimeWithOnlyNullValue1([IdlProviders] string providerName) | |
| 686 { | |
| 687 ForProvider( | |
| 688 providerName, | |
| 689 db => | |
| 690 { | |
| 691 var dates = new DateTime?[] { null }; | |
| 692 | |
| 693 // Ensures that the query works properly in memory | |
| 694 // ReSharper disable RemoveToList.2 | |
| 695 var resultCount = db.Types2.ToList().Count(x => dates.Contains(x.DateTimeValue2)); | |
| 696 // ReSharper restore RemoveToList.2 | |
| 697 Assert.That(resultCount, Is.GreaterThan(0)); | |
| 698 | |
| 699 var result = db.Types2.Count(x => dates.Contains(x.DateTimeValue2)); | |
| 700 Assert.That(result, Is.EqualTo(resultCount)); | |
| 701 }); | |
| 702 } | |
| 703 | |
| 704 [Test] | |
| 705 public void TestContainsForNullableDateTimeWithOnlyNullValue2([IdlProviders] string providerName) | |
| 706 { | |
| 707 ForProvider( | |
| 708 providerName, | |
| 709 db => | |
| 710 { | |
| 711 // Ensures that the query works properly in memory | |
| 712 // ReSharper disable RemoveToList.2 | |
| 713 var resultCount = db.Types2.ToList().Count(x => new DateTime?[] { null }.Contains(x.DateTimeValue2)); | |
| 714 // ReSharper restore RemoveToList.2 | |
| 715 Assert.That(resultCount, Is.GreaterThan(0)); | |
| 716 | |
| 717 var result = db.Types2.Count(x => new DateTime?[] { null }.Contains(x.DateTimeValue2)); | |
| 718 Assert.That(result, Is.EqualTo(resultCount)); | |
| 719 }); | |
| 720 } | |
| 721 | |
| 722 [Test] | |
| 723 public void TestContainsForNullableDateTimeWithNullAndNotNullValues1([IdlProviders] string providerName) | |
| 724 { | |
| 725 ForProvider( | |
| 726 providerName, | |
| 727 db => | |
| 728 { | |
| 729 var date = new DateTime(2009, 9, 24, 9, 19, 29, 90); | |
| 730 var dates = new DateTime?[] { null, date }; | |
| 731 | |
| 732 // Ensures that the query works properly in memory | |
| 733 // ReSharper disable RemoveToList.2 | |
| 734 var resultCount = db.Types2.ToList().Count(x => dates.Contains(x.DateTimeValue2)); | |
| 735 // ReSharper restore RemoveToList.2 | |
| 736 Assert.That(resultCount, Is.GreaterThan(0)); | |
| 737 | |
| 738 var result = db.Types2.Count(x => dates.Contains(x.DateTimeValue2)); | |
| 739 Assert.That(result, Is.EqualTo(resultCount)); | |
| 740 }); | |
| 741 } | |
| 742 | |
| 743 [Test] | |
| 744 public void TestContainsForNullableDateTimeWithNullAndNotNullValues2([IdlProviders] string providerName) | |
| 745 { | |
| 746 ForProvider( | |
| 747 providerName, | |
| 748 db => | |
| 749 { | |
| 750 // Ensures that the query works properly in memory | |
| 751 // ReSharper disable RemoveToList.2 | |
| 752 var resultCount = db.Types2.ToList().Count(x => new DateTime?[] { null, new DateTime(2009, 9, 24, 9, 19, 29, 90) }.Contains(x.DateTimeValue2)); | |
| 753 // ReSharper restore RemoveToList.2 | |
| 754 Assert.That(resultCount, Is.GreaterThan(0)); | |
| 755 | |
| 756 var result = db.Types2.Count(x => new DateTime?[] { null, new DateTime(2009, 9, 24, 9, 19, 29, 90) }.Contains(x.DateTimeValue2)); | |
| 757 Assert.That(result, Is.EqualTo(resultCount)); | |
| 758 }); | |
| 759 } | |
| 760 | |
| 761 #region GenericQuery classes | |
| 762 | |
| 763 public abstract partial class GenericQueryBase | |
| 764 { | |
| 765 private readonly IdlPatientSource m_ds; | |
| 766 | |
| 767 protected GenericQueryBase(ITestDataContext ds) | |
| 768 { | |
| 769 m_ds = new IdlPatientSource(ds); | |
| 770 } | |
| 771 | |
| 772 #region Object sources | |
| 773 | |
| 774 protected IQueryable<IdlPerson> AllPersons | |
| 775 { | |
| 776 get { return m_ds.Persons(); } | |
| 777 } | |
| 778 | |
| 779 protected IQueryable<IdlPatient> AllPatients | |
| 780 { | |
| 781 get { return m_ds.Patients(); } | |
| 782 } | |
| 783 | |
| 784 protected IQueryable<IdlGrandChild> AllGrandChilds | |
| 785 { | |
| 786 get { return m_ds.GrandChilds(); } | |
| 787 } | |
| 788 | |
| 789 #endregion | |
| 790 | |
| 791 public abstract IEnumerable<object> Query(); | |
| 792 } | |
| 793 | |
| 794 public class GenericConcatQuery : GenericQueryBase | |
| 795 { | |
| 796 private String @p1; | |
| 797 private Int32 @p2; | |
| 798 | |
| 799 public GenericConcatQuery(ITestDataContext ds, object[] args) | |
| 800 : base(ds) | |
| 801 { | |
| 802 @p1 = (String)args[0]; | |
| 803 @p2 = (Int32)args[1]; | |
| 804 } | |
| 805 | |
| 806 public override IEnumerable<object> Query() | |
| 807 { | |
| 808 return (from y in AllPersons | |
| 809 select y.Name) | |
| 810 .Concat( | |
| 811 from x in AllPersons | |
| 812 from z in AllPatients | |
| 813 where (x.Name == @p1 || z.Id == new ObjectId { Value = @p2 }) | |
| 814 select x.Name | |
| 815 ); | |
| 816 } | |
| 817 } | |
| 818 | |
| 819 public class GenericConcatJoinOrderQuery : GenericQueryBase | |
| 820 { | |
| 821 private String @p1; | |
| 822 private Int32 @p2; | |
| 823 | |
| 824 public GenericConcatJoinOrderQuery(ITestDataContext ds, object[] args) | |
| 825 : base(ds) | |
| 826 { | |
| 827 @p1 = (String)args[0]; | |
| 828 @p2 = (Int32)args[1]; | |
| 829 } | |
| 830 | |
| 831 public override IEnumerable<object> Query() | |
| 832 { | |
| 833 return (from j in | |
| 834 (from y in AllPersons | |
| 835 select new { FirstName = y.Name }) | |
| 836 .Concat( | |
| 837 from x in AllPersons | |
| 838 from z in AllPatients | |
| 839 where (x.Name == @p1 || z.Id == new ObjectId { Value = @p2 }) | |
| 840 select new { FirstName = x.Name } | |
| 841 ) | |
| 842 join g in AllGrandChilds on j.FirstName equals @p1 | |
| 843 orderby g.ParentID.Value | |
| 844 select new { FirstName = g.ParentID.Value.ToString() }); | |
| 845 } | |
| 846 } | |
| 847 | |
| 848 #endregion | |
| 849 | |
| 850 [Test] | |
| 851 public void TestMono01() | |
| 852 { | |
| 853 ForMySqlProvider( | |
| 854 db => | |
| 855 { | |
| 856 var ds = new IdlPatientSource(db); | |
| 857 var t = "A"; | |
| 858 var query = | |
| 859 (from y in ds.Persons() | |
| 860 select y.Name) | |
| 861 .Concat( | |
| 862 from x in ds.Persons() | |
| 863 where x.Name == t | |
| 864 select x.Name | |
| 865 ); | |
| 866 | |
| 867 Assert.That(query.ToList(), Is.Not.Null); | |
| 868 }); | |
| 869 } | |
| 870 | |
| 871 [Test] | |
| 872 public void TestMono03() | |
| 873 { | |
| 874 ForMySqlProvider( | |
| 875 db => Assert.That(new GenericConcatQuery(db, new object[] { "A", 1 }).Query().ToList(), Is.Not.Null)); | |
| 876 } | |
| 877 | |
| 878 [Test] | |
| 879 public void TestMono04() | |
| 880 { | |
| 881 ForMySqlProvider( | |
| 882 db => | |
| 883 Assert.That( | |
| 884 new GenericConcatJoinOrderQuery(db, new object[] { "A", 1 }).Query().ToList(), Is.Not.Null)); | |
| 885 } | |
| 886 | |
| 887 public static IQueryable<TSource> Concat2<TSource>(IQueryable<TSource> source1, IEnumerable<TSource> source2) | |
| 888 { | |
| 889 return source1.Provider.CreateQuery<TSource>( | |
| 890 Expression.Call( | |
| 891 null, | |
| 892 typeof (Queryable).GetMethod("Concat").MakeGenericMethod(typeof (TSource)), | |
| 893 new[] { source1.Expression, Expression.Constant(source2, typeof (IEnumerable<TSource>)) })); | |
| 894 } | |
| 895 | |
| 896 [Test] | |
| 897 public void TestMonoConcat() | |
| 898 { | |
| 899 ForMySqlProvider( | |
| 900 db => | |
| 901 { | |
| 902 var ds = new IdlPatientSource(db); | |
| 903 var t = "A"; | |
| 904 var query = Concat2( | |
| 905 from y in ds.Persons() select y.Name, | |
| 906 from x in ds.Persons() where x.Name == t select x.Name); | |
| 907 | |
| 908 Assert.That(query.ToList(), Is.Not.Null); | |
| 909 }); | |
| 910 } | |
| 911 | |
| 912 [Test] | |
| 913 public void TestMonoConcat2() | |
| 914 { | |
| 915 ForMySqlProvider( | |
| 916 db => | |
| 917 { | |
| 918 var ds = new IdlPatientSource(db); | |
| 919 var t = "A"; | |
| 920 var query1 = Concat2( | |
| 921 from y in ds.Persons() select y.Name, | |
| 922 from x in ds.Persons() where x.Name == t select x.Name); | |
| 923 | |
| 924 Assert.That(query1.ToList(), Is.Not.Null); | |
| 925 }); | |
| 926 | |
| 927 ForMySqlProvider( | |
| 928 db => | |
| 929 { | |
| 930 var ds = new IdlPatientSource(db); | |
| 931 var t = "A"; | |
| 932 var query2 = Concat2( | |
| 933 from y in ds.Persons() select y.Name, | |
| 934 from x in ds.Persons() where x.Name == t select x.Name); | |
| 935 | |
| 936 Assert.That(query2.ToList(), Is.Not.Null); | |
| 937 }); | |
| 938 } | |
| 939 } | |
| 940 | |
| 941 #region TestConvertFunction classes | |
| 942 | |
| 943 public class IdlPatient | |
| 944 { | |
| 945 public IdlTest.ObjectId Id { get; set; } | |
| 946 } | |
| 947 | |
| 948 public class IdlPerson | |
| 949 { | |
| 950 public IdlTest.ObjectId Id { get; set; } | |
| 951 public string Name { get; set; } | |
| 952 } | |
| 953 | |
| 954 public class IdlGrandChild | |
| 955 { | |
| 956 public IdlTest.ObjectId ParentID { get; set; } | |
| 957 public IdlTest.ObjectId ChildID { get; set; } | |
| 958 public IdlTest.ObjectId GrandChildID { get; set; } | |
| 959 } | |
| 960 | |
| 961 public class IdlPatientEx : IdlPatient | |
| 962 { | |
| 963 public IdlPerson Person { get; set; } | |
| 964 } | |
| 965 | |
| 966 public class IdlPatientSource | |
| 967 { | |
| 968 private readonly ITestDataContext m_dc; | |
| 969 | |
| 970 public IdlPatientSource(ITestDataContext dc) | |
| 971 { | |
| 972 m_dc = dc; | |
| 973 } | |
| 974 | |
| 975 public IQueryable<IdlGrandChild> GrandChilds() | |
| 976 { | |
| 977 return m_dc.GrandChild.Select( | |
| 978 x => new IdlGrandChild | |
| 979 { | |
| 980 ChildID = new IdlTest.ObjectId { Value = x.ChildID.Value }, | |
| 981 GrandChildID = new IdlTest.ObjectId { Value = x.GrandChildID.Value }, | |
| 982 ParentID = new IdlTest.ObjectId { Value = x.ParentID.Value } | |
| 983 }); | |
| 984 } | |
| 985 | |
| 986 public IQueryable<IdlPatient> Patients() | |
| 987 { | |
| 988 return m_dc.Patient.Select(x => new IdlPatient { Id = new IdlTest.ObjectId { Value = x.PersonID }, }); | |
| 989 } | |
| 990 | |
| 991 public IQueryable<IdlPerson> Persons() | |
| 992 { | |
| 993 return | |
| 994 m_dc.Person.Select( | |
| 995 x => new IdlPerson { Id = new IdlTest.ObjectId { Value = x.ID }, Name = x.FirstName, }); | |
| 996 } | |
| 997 } | |
| 998 | |
| 999 public static class IdlPersonConverterExtensions | |
| 1000 { | |
| 1001 public static IEnumerable<IdlPatientEx> ToIdlPatientEx( | |
| 1002 this IQueryable<IdlPatient> list, IdlPatientSource source) | |
| 1003 { | |
| 1004 return from x in list | |
| 1005 join person in source.Persons() on x.Id.Value equals person.Id.Value | |
| 1006 select new IdlPatientEx | |
| 1007 { | |
| 1008 Id = x.Id, | |
| 1009 Person = | |
| 1010 new IdlPerson { Id = new IdlTest.ObjectId { Value = person.Id }, Name = person.Name, }, | |
| 1011 }; | |
| 1012 } | |
| 1013 } | |
| 1014 | |
| 1015 #endregion | |
| 1016 } |
