Query_LeftJoin_BySelectMany_Test.cs 7.5 KB

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