Query_LeftJoin_ByGroupJoin_Test.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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_ByGroupJoin_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. join father in userQuery on user.fatherId equals father.id into fathers
  19. from father in fathers.DefaultIfEmpty()
  20. where user.id > 2
  21. orderby user.id
  22. select new { user, 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. // Lambda Expression
  32. {
  33. var query =
  34. userQuery.GroupJoin(
  35. userQuery
  36. , user => user.fatherId
  37. , father => father.id
  38. , (user, fathers) => new { user, fathers }
  39. )
  40. .SelectMany(
  41. row => row.fathers.DefaultIfEmpty()
  42. , (row, father) => new { row, father }
  43. )
  44. .Where(row2 => row2.row.user.id > 2)
  45. .OrderBy(row2 => row2.row.user.id)
  46. .Select(row2 => new { row2.row.user, row2.father });
  47. var sql = query.ToExecuteString();
  48. var userList = query.ToList();
  49. Assert.AreEqual(4, userList.Count);
  50. Assert.AreEqual(3, userList[0].user.id);
  51. Assert.AreEqual(5, userList[0].father?.id);
  52. Assert.AreEqual(4, userList[1].user.id);
  53. Assert.AreEqual(null, userList[1].father?.name);
  54. }
  55. }
  56. [TestMethod]
  57. public void Test_LeftJoin_Complex()
  58. {
  59. using var dbContext = DataSource.CreateDbContext();
  60. var userQuery = dbContext.Query<User>();
  61. // Linq Expresssion
  62. {
  63. var query =
  64. from user in userQuery
  65. join father in userQuery on user.fatherId equals father.id into fathers
  66. from father in fathers.DefaultIfEmpty()
  67. join mother in userQuery on user.motherId equals mother.id into mothers
  68. from mother in mothers.DefaultIfEmpty()
  69. where user.id > 2
  70. orderby user.id
  71. select new
  72. {
  73. user,
  74. father,
  75. mother,
  76. testId = user.id + 100,
  77. hasFather = father.name != null ? true : false
  78. };
  79. query = query.Skip(1).Take(2);
  80. var sql = query.ToExecuteString();
  81. var userList = query.ToList();
  82. Assert.AreEqual(2, userList.Count);
  83. var first = userList.First();
  84. Assert.AreEqual(4, first.user.id);
  85. Assert.AreEqual(null, first.father?.name);
  86. Assert.AreEqual(null, first.mother?.name);
  87. Assert.AreEqual(104, first.testId);
  88. Assert.AreEqual(false, first.hasFather);
  89. }
  90. }
  91. }
  92. }