ExpressionTester.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. using System.Data;
  2. using System.Linq.Expressions;
  3. using Microsoft.VisualStudio.TestTools.UnitTesting;
  4. namespace Vit.Linq.ExpressionNodes.ExpressionNodesTest
  5. {
  6. public abstract partial class ExpressionTester
  7. {
  8. public static List<User> Test(IQueryable<User> query, Expression<Func<User, bool>> predicate)
  9. {
  10. var expected = GetSourceData().AsQueryable().Where(predicate).ToList();
  11. if (expected.Count == 0) throw new Exception("result of predicate must not be empty");
  12. {
  13. var actual = query.Where(predicate).ToList();
  14. Check(expected, actual);
  15. return actual;
  16. }
  17. void Check(List<User> expected, List<User> actual)
  18. {
  19. Assert.AreEqual(expected.Count, actual.Count);
  20. for (var t = 0; t < expected.Count; t++)
  21. {
  22. Assert.AreEqual(expected[t].id, actual[t].id);
  23. }
  24. }
  25. }
  26. public static void TestQueryable(IQueryable<User> query)
  27. {
  28. Expression<Func<User, bool>> predicate;
  29. #region #0 Add, An addition operation, such as a + b, without overflow checking, for numeric operands.
  30. {
  31. predicate = u => u.id + 1 == 6;
  32. var rows = Test(query, predicate);
  33. Assert.AreEqual(5, rows[0].id);
  34. }
  35. #endregion
  36. #region #3 AndAlso, A conditional AND operation that evaluates the second operand only if the first operand evaluates to true. It corresponds to (a && b)
  37. {
  38. predicate = u => u.id > 5 && u.id < 7;
  39. var rows = Test(query, predicate);
  40. }
  41. #endregion
  42. #region #7 Coalesce, A node that represents a null coalescing operation, such as (a ?? b)
  43. {
  44. predicate = u => (u.fatherId ?? u.id) == 5;
  45. var rows = Test(query, predicate);
  46. }
  47. #endregion
  48. #region #8 Conditional, A conditional operation, such as a > b ? a : b
  49. {
  50. predicate = u => (u.id == 2 ? 1 : 0) == 1;
  51. var rows = Test(query, predicate);
  52. }
  53. #endregion
  54. #region #9 Constant, A constant value.
  55. {
  56. predicate = u => u.id == 2;
  57. var rows = Test(query, predicate);
  58. }
  59. #endregion
  60. #region #10 Convert, A cast or conversion operation, such as (SampleType)obj
  61. {
  62. predicate = u => ((double)u.id) <= 2.0;
  63. var rows = Test(query, predicate);
  64. }
  65. #endregion
  66. #region #12 Divide, A division operation, such as (a / b), for numeric operands.
  67. {
  68. predicate = u => u.id / 10.0 == 10.0;
  69. var rows = Test(query, predicate);
  70. }
  71. #endregion
  72. #region #13 Equal, A node that represents an equality comparison, such as (a == b)
  73. {
  74. predicate = u => u.id == 2;
  75. var rows = Test(query, predicate);
  76. }
  77. {
  78. predicate = u => u.fatherId == null;
  79. var rows = Test(query, predicate);
  80. }
  81. #endregion
  82. #region #15 GreaterThan, A "greater than" comparison, such as (a > b).
  83. {
  84. predicate = u => u.id > 5;
  85. var rows = Test(query, predicate);
  86. }
  87. #endregion
  88. #region #16 GreaterThanOrEqual, A "greater than or equal to" comparison, such as (a >= b).
  89. {
  90. predicate = u => u.id >= 5;
  91. var rows = Test(query, predicate);
  92. }
  93. #endregion
  94. #region #20 LessThan, A "less than" comparison, such as (a < b).
  95. {
  96. predicate = u => u.id < 5;
  97. var rows = Test(query, predicate);
  98. }
  99. #endregion
  100. #region #21 LessThanOrEqual, A "less than or equal to" comparison, such as (a <= b).
  101. {
  102. predicate = u => u.id <= 5;
  103. var rows = Test(query, predicate);
  104. }
  105. #endregion
  106. #region #23 MemberAccess, An operation that reads from a field or property, such as obj.SampleProperty.
  107. {
  108. predicate = u => u.id == 5;
  109. var rows = Test(query, predicate);
  110. }
  111. #endregion
  112. #region #25 Modulo, An arithmetic remainder operation, such as (a % b)
  113. {
  114. predicate = u => (u.id % 10) == 0;
  115. var rows = Test(query, predicate);
  116. }
  117. #endregion
  118. #region #26 Multiply, A multiplication operation, such as (a * b), without overflow checking, for numeric operands
  119. {
  120. predicate = u => u.id * 10 == 20;
  121. var rows = Test(query, predicate);
  122. }
  123. #endregion
  124. #region #28 Negate, An arithmetic negation operation, such as (-a). The object a should not be modified in place.
  125. {
  126. predicate = u => -u.id == -2;
  127. var rows = Test(query, predicate);
  128. }
  129. #endregion
  130. #region #34 Not, A bitwise complement or logical negation operation. It is equivalent to (~a) for integral types and to (!a) for Boolean values.
  131. {
  132. predicate = u => !(u.id == 2);
  133. var rows = Test(query, predicate);
  134. }
  135. #endregion
  136. #region #35 NotEqual, An inequality comparison, such as (a != b)
  137. {
  138. predicate = u => u.id != 2;
  139. var rows = Test(query, predicate);
  140. }
  141. {
  142. predicate = u => u.fatherId != null;
  143. var rows = Test(query, predicate);
  144. }
  145. #endregion
  146. #region #37 OrElse, A short-circuiting conditional OR operation, such as (a || b)
  147. {
  148. predicate = u => u.id == 2 || u.id == 3;
  149. var rows = Test(query, predicate);
  150. }
  151. #endregion
  152. #region #42 Subtract, A subtraction operation, such as (a - b), without overflow checking
  153. {
  154. predicate = u => u.id - 2 == 9;
  155. var rows = Test(query, predicate);
  156. }
  157. #endregion
  158. #region Test the priority of mathematical calculations
  159. {
  160. predicate = u => 10 + u.id * 10 == 110;
  161. var rows = Test(query, predicate);
  162. }
  163. #endregion
  164. }
  165. }
  166. }