DbExpressionEqualityComparer.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using Ant.Common;
  2. using Ant.DbExpressions;
  3. using Ant.Utility;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. namespace Ant.Query
  9. {
  10. static class DbExpressionEqualityComparer
  11. {
  12. public static bool EqualsCompare(DbExpression exp1, DbExpression exp2)
  13. {
  14. if (exp1.NodeType != exp2.NodeType)
  15. return false;
  16. if (exp1 == exp2)
  17. return true;
  18. switch (exp1.NodeType)
  19. {
  20. case DbExpressionType.ColumnAccess:
  21. return AreEqual((DbColumnAccessExpression)exp1, (DbColumnAccessExpression)exp2);
  22. case DbExpressionType.Table:
  23. return AreEqual((DbTableExpression)exp1, (DbTableExpression)exp2);
  24. case DbExpressionType.Constant:
  25. return AreEqual((DbConstantExpression)exp1, (DbConstantExpression)exp2);
  26. case DbExpressionType.Convert:
  27. return AreEqual((DbConvertExpression)exp1, (DbConvertExpression)exp2);
  28. case DbExpressionType.Parameter:
  29. return AreEqual((DbParameterExpression)exp1, (DbParameterExpression)exp2);
  30. case DbExpressionType.MemberAccess:
  31. return AreEqual((DbMemberExpression)exp1, (DbMemberExpression)exp2);
  32. case DbExpressionType.Call:
  33. return AreEqual((DbMethodCallExpression)exp1, (DbMethodCallExpression)exp2);
  34. case DbExpressionType.Add:
  35. case DbExpressionType.Subtract:
  36. case DbExpressionType.Multiply:
  37. case DbExpressionType.Divide:
  38. case DbExpressionType.And:
  39. case DbExpressionType.Or:
  40. case DbExpressionType.Equal:
  41. case DbExpressionType.NotEqual:
  42. case DbExpressionType.LessThan:
  43. case DbExpressionType.LessThanOrEqual:
  44. case DbExpressionType.GreaterThan:
  45. case DbExpressionType.GreaterThanOrEqual:
  46. return AreEqual((DbBinaryExpression)exp1, (DbBinaryExpression)exp2);
  47. default:
  48. return exp1 == exp2;
  49. }
  50. }
  51. public static bool AreEqual(DbColumnAccessExpression exp1, DbColumnAccessExpression exp2)
  52. {
  53. if (exp1.Column.Name != exp2.Column.Name)
  54. return false;
  55. return exp1.Table.Name == exp2.Table.Name;
  56. }
  57. public static bool AreEqual(DbTableExpression exp1, DbTableExpression exp2)
  58. {
  59. return exp1.Table.Name == exp2.Table.Name;
  60. }
  61. public static bool AreEqual(DbConstantExpression exp1, DbConstantExpression exp2)
  62. {
  63. return AntUtils.AreEqual(exp1.Value, exp2.Value);
  64. }
  65. public static bool AreEqual(DbConvertExpression exp1, DbConvertExpression exp2)
  66. {
  67. if (exp1.Type != exp2.Type)
  68. return false;
  69. return EqualsCompare(exp1.Operand, exp2.Operand);
  70. }
  71. public static bool AreEqual(DbParameterExpression exp1, DbParameterExpression exp2)
  72. {
  73. return AntUtils.AreEqual(exp1.Value, exp2.Value);
  74. }
  75. public static bool AreEqual(DbMemberExpression exp1, DbMemberExpression exp2)
  76. {
  77. if (exp1.Member != exp2.Member)
  78. return false;
  79. return EqualsCompare(exp1.Expression, exp2.Expression);
  80. }
  81. public static bool AreEqual(DbMethodCallExpression exp1, DbMethodCallExpression exp2)
  82. {
  83. if (exp1.Method != exp2.Method)
  84. return false;
  85. if (exp1.Arguments.Count != exp2.Arguments.Count)
  86. return false;
  87. if (exp1.Object != null && exp2.Object != null)
  88. {
  89. /* instance method */
  90. if (!EqualsCompare(exp1.Object, exp2.Object))
  91. return false;
  92. }
  93. for (int i = 0; i < exp1.Arguments.Count; i++)
  94. {
  95. if (!EqualsCompare(exp1.Arguments[i], exp2.Arguments[i]))
  96. return false;
  97. }
  98. return true;
  99. }
  100. public static bool AreEqual(DbBinaryExpression exp1, DbBinaryExpression exp2)
  101. {
  102. if (exp1.Method != exp2.Method)
  103. return false;
  104. if (!EqualsCompare(exp1.Left, exp2.Left))
  105. return false;
  106. if (!EqualsCompare(exp1.Right, exp2.Right))
  107. return false;
  108. return true;
  109. }
  110. }
  111. }