QueryableBuilder_Test.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using System;
  2. using System.Data;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using Microsoft.VisualStudio.TestTools.UnitTesting;
  6. using Vit.Core.Module.Serialization;
  7. using Vit.Linq;
  8. using Vit.Linq.FilterRules;
  9. namespace Vit.Linq.MsTest
  10. {
  11. [TestClass]
  12. public class QueryableBuilder_Test
  13. {
  14. [TestMethod]
  15. public void Test()
  16. {
  17. {
  18. Func<Expression, Type, object> QueryExecutor = (exp, type) =>
  19. {
  20. var queryAction = new FilterGenerateService().ConvertToQueryAction(exp);
  21. var strQuery = Json.Serialize(queryAction);
  22. var exp2 = new FilterService().ConvertToCode_PredicateExpression<Person>(queryAction.filter);
  23. var queryAction2 = new FilterGenerateService().ConvertToQueryAction(exp2);
  24. var strQuery2 = Json.Serialize(queryAction2);
  25. var query = DataSource.GetQueryable().Where(queryAction.filter);
  26. query = query.OrderBy(queryAction.orders);
  27. var rangedQuery = query;
  28. if (queryAction.skip.HasValue)
  29. rangedQuery = rangedQuery.Skip(queryAction.skip.Value);
  30. if (queryAction.take.HasValue)
  31. rangedQuery = rangedQuery.Take(queryAction.take.Value);
  32. switch (queryAction.method)
  33. {
  34. case nameof(Queryable.First): return rangedQuery.First();
  35. case nameof(Queryable.FirstOrDefault): return rangedQuery.FirstOrDefault();
  36. case nameof(Queryable.Last): return rangedQuery.Last();
  37. case nameof(Queryable.LastOrDefault): return rangedQuery.LastOrDefault();
  38. case nameof(Queryable.Count): return rangedQuery.Count();
  39. case nameof(Queryable_Extensions.TotalCount): return query.Count();
  40. case nameof(Queryable_Extensions.ToListAndTotalCount): return (rangedQuery.ToList(), query.Count());
  41. default:
  42. // ToList
  43. return rangedQuery;
  44. }
  45. };
  46. var query = QueryableBuilder.Build<Person>(QueryExecutor);
  47. query = query
  48. .Where(m => m.id >= 10)
  49. .Where(m => m.id < 20)
  50. .Where(m => !m.name.Contains("8"))
  51. .Where(m => !m.job.name.Contains("6"))
  52. .OrderBy(m => m.job.name)
  53. .OrderByDescending(m => m.id)
  54. .ThenBy(m => m.job.departmentId)
  55. .ThenByDescending(m => m.name)
  56. .Skip(1)
  57. .Take(5);
  58. #region Count
  59. {
  60. var count = query.Count();
  61. Assert.AreEqual(5, count);
  62. }
  63. #endregion
  64. #region TotalCount
  65. {
  66. var totalCount = query.TotalCount();
  67. Assert.AreEqual(8, totalCount);
  68. }
  69. #endregion
  70. #region ToListAndTotalCount
  71. {
  72. var (list, totalCount) = query.ToListAndTotalCount();
  73. Assert.AreEqual(8, totalCount);
  74. Assert.AreEqual(5, list.Count);
  75. Assert.AreEqual(17, list[0].id);
  76. Assert.AreEqual(15, list[1].id);
  77. }
  78. #endregion
  79. #region ToList
  80. {
  81. var list = query.ToList();
  82. Assert.AreEqual(5, list.Count);
  83. Assert.AreEqual(17, list[0].id);
  84. Assert.AreEqual(15, list[1].id);
  85. }
  86. #endregion
  87. }
  88. }
  89. }
  90. }