Query_InnerJoin_BySelectMany_Test.cs 7.0 KB

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