Query_LeftJoin_BySelectMany_Test.cs 7.6 KB

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