Query_LeftJoin_BySelectMany_Test.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using System.Data;
  2. using Microsoft.VisualStudio.TestTools.UnitTesting;
  3. namespace Vitorm.MsTest.CommonTest
  4. {
  5. [TestClass]
  6. public class Query_LeftJoin_BySelectMany_Test
  7. {
  8. [TestMethod]
  9. public void Test_LeftJoin_Demo()
  10. {
  11. using var dbContext = DataSource.CreateDbContext();
  12. var userQuery = dbContext.Query<User>();
  13. // Lambda Expression
  14. {
  15. var query =
  16. userQuery.SelectMany(
  17. user => userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
  18. , (user, father) => new { user, father }
  19. )
  20. .Where(row => row.user.id > 2)
  21. .OrderBy(row => row.user.id)
  22. .Select(row => new { row.user, row.father });
  23. var sql = query.ToExecuteString();
  24. var userList = query.ToList();
  25. Assert.AreEqual(4, userList.Count);
  26. Assert.AreEqual(3, userList[0].user.id);
  27. Assert.AreEqual(5, userList[0].father?.id);
  28. Assert.AreEqual(4, userList[1].user.id);
  29. Assert.AreEqual(null, userList[1].father?.name);
  30. }
  31. }
  32. [TestMethod]
  33. public void Test_LeftJoin_Complex()
  34. {
  35. using var dbContext = DataSource.CreateDbContext();
  36. var userQuery = dbContext.Query<User>();
  37. // Linq Expression
  38. {
  39. var query =
  40. from user in userQuery
  41. from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
  42. from mother in userQuery.Where(mother => user.motherId == mother.id).DefaultIfEmpty()
  43. from userClass in dbContext.Query<UserClass>().Where(userClass => user.classId == userClass.id).DefaultIfEmpty()
  44. where user.id > 1 && userClass.id == 1
  45. orderby user.id
  46. select new
  47. {
  48. user,
  49. father,
  50. mother,
  51. userClass,
  52. userClass.name,
  53. testId = user.id + 100,
  54. hasFather = father.name != null ? true : false
  55. };
  56. query = query.Skip(1).Take(2);
  57. var sql = query.ToExecuteString();
  58. var userList = query.ToList();
  59. Assert.AreEqual(2, userList.Count);
  60. var first = userList.First();
  61. Assert.AreEqual(4, first.user.id);
  62. Assert.AreEqual(null, first.father?.name);
  63. Assert.AreEqual(null, first.mother?.name);
  64. Assert.AreEqual(104, first.testId);
  65. Assert.AreEqual(false, first.hasFather);
  66. }
  67. }
  68. [TestMethod]
  69. public void Test_MultipleSelect()
  70. {
  71. using var dbContext = DataSource.CreateDbContext();
  72. var userQuery = dbContext.Query<User>();
  73. {
  74. var query = from user in userQuery
  75. from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
  76. where user.id > 2 && father.name != null
  77. orderby user.id
  78. select new
  79. {
  80. user,
  81. father
  82. };
  83. var userList = query.ToList();
  84. Assert.AreEqual(1, userList.Count);
  85. Assert.AreEqual(3, userList.First().user.id);
  86. }
  87. {
  88. var query = from user in userQuery
  89. from father in userQuery.Where(father => user.fatherId == father.id)
  90. from mother in userQuery.Where(mother => user.motherId == mother.id)
  91. orderby user.id
  92. select new
  93. {
  94. uniqueId = user.id + "_" + father.id + "_" + mother.id,
  95. uniqueId1 = user.id + "_" + user.fatherId + "_" + user.motherId,
  96. user,
  97. user2 = user,
  98. user3 = user,
  99. father,
  100. hasFather = user.fatherId != null ? true : false,
  101. fatherName = father.name,
  102. mother
  103. };
  104. var userList = query.ToList();
  105. Assert.AreEqual(3, userList.Count);
  106. Assert.AreEqual(1, userList.First().user.id);
  107. Assert.AreEqual(3, userList.Last().user.id);
  108. Assert.AreEqual(5, userList.Last().father?.id);
  109. }
  110. {
  111. var query = from user in userQuery
  112. from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
  113. from mother in userQuery.Where(mother => user.motherId == mother.id).DefaultIfEmpty()
  114. orderby user.id
  115. select new
  116. {
  117. user,
  118. father,
  119. userId = user.id + 100,
  120. hasFather = user.fatherId != null ? true : false,
  121. hasFather2 = father != null,
  122. fatherName = father.name,
  123. motherName = mother.name,
  124. };
  125. var userList = query.ToList();
  126. Assert.AreEqual(6, userList.Count);
  127. Assert.AreEqual(1, userList.First().user.id);
  128. Assert.AreEqual(101, userList.First().userId);
  129. Assert.AreEqual(6, userList.Last().user.id);
  130. Assert.AreEqual(5, userList[2].father.id);
  131. }
  132. }
  133. [TestMethod]
  134. public void Test_Count()
  135. {
  136. using var dbContext = DataSource.CreateDbContext();
  137. var userQuery = dbContext.Query<User>();
  138. {
  139. var count = (from user in userQuery
  140. from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
  141. where user.id > 2 && father.name == null
  142. select new
  143. {
  144. father
  145. }).Count();
  146. Assert.AreEqual(3, count);
  147. }
  148. }
  149. }
  150. }