Query_LeftJoin_BySelectMany_Test.cs 7.5 KB

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