123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- using Ant.Common;
- using Ant.DbExpressions;
- using Ant.Utility;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Ant.Query
- {
- static class DbExpressionEqualityComparer
- {
- public static bool EqualsCompare(DbExpression exp1, DbExpression exp2)
- {
- if (exp1.NodeType != exp2.NodeType)
- return false;
- if (exp1 == exp2)
- return true;
- switch (exp1.NodeType)
- {
- case DbExpressionType.ColumnAccess:
- return AreEqual((DbColumnAccessExpression)exp1, (DbColumnAccessExpression)exp2);
- case DbExpressionType.Table:
- return AreEqual((DbTableExpression)exp1, (DbTableExpression)exp2);
- case DbExpressionType.Constant:
- return AreEqual((DbConstantExpression)exp1, (DbConstantExpression)exp2);
- case DbExpressionType.Convert:
- return AreEqual((DbConvertExpression)exp1, (DbConvertExpression)exp2);
- case DbExpressionType.Parameter:
- return AreEqual((DbParameterExpression)exp1, (DbParameterExpression)exp2);
- case DbExpressionType.MemberAccess:
- return AreEqual((DbMemberExpression)exp1, (DbMemberExpression)exp2);
- case DbExpressionType.Call:
- return AreEqual((DbMethodCallExpression)exp1, (DbMethodCallExpression)exp2);
- case DbExpressionType.Add:
- case DbExpressionType.Subtract:
- case DbExpressionType.Multiply:
- case DbExpressionType.Divide:
- case DbExpressionType.And:
- case DbExpressionType.Or:
- case DbExpressionType.Equal:
- case DbExpressionType.NotEqual:
- case DbExpressionType.LessThan:
- case DbExpressionType.LessThanOrEqual:
- case DbExpressionType.GreaterThan:
- case DbExpressionType.GreaterThanOrEqual:
- return AreEqual((DbBinaryExpression)exp1, (DbBinaryExpression)exp2);
- default:
- return exp1 == exp2;
- }
- }
- public static bool AreEqual(DbColumnAccessExpression exp1, DbColumnAccessExpression exp2)
- {
- if (exp1.Column.Name != exp2.Column.Name)
- return false;
- return exp1.Table.Name == exp2.Table.Name;
- }
- public static bool AreEqual(DbTableExpression exp1, DbTableExpression exp2)
- {
- return exp1.Table.Name == exp2.Table.Name;
- }
- public static bool AreEqual(DbConstantExpression exp1, DbConstantExpression exp2)
- {
- return AntUtils.AreEqual(exp1.Value, exp2.Value);
- }
- public static bool AreEqual(DbConvertExpression exp1, DbConvertExpression exp2)
- {
- if (exp1.Type != exp2.Type)
- return false;
- return EqualsCompare(exp1.Operand, exp2.Operand);
- }
- public static bool AreEqual(DbParameterExpression exp1, DbParameterExpression exp2)
- {
- return AntUtils.AreEqual(exp1.Value, exp2.Value);
- }
- public static bool AreEqual(DbMemberExpression exp1, DbMemberExpression exp2)
- {
- if (exp1.Member != exp2.Member)
- return false;
- return EqualsCompare(exp1.Expression, exp2.Expression);
- }
- public static bool AreEqual(DbMethodCallExpression exp1, DbMethodCallExpression exp2)
- {
- if (exp1.Method != exp2.Method)
- return false;
- if (exp1.Arguments.Count != exp2.Arguments.Count)
- return false;
- if (exp1.Object != null && exp2.Object != null)
- {
- /* instance method */
- if (!EqualsCompare(exp1.Object, exp2.Object))
- return false;
- }
- for (int i = 0; i < exp1.Arguments.Count; i++)
- {
- if (!EqualsCompare(exp1.Arguments[i], exp2.Arguments[i]))
- return false;
- }
- return true;
- }
- public static bool AreEqual(DbBinaryExpression exp1, DbBinaryExpression exp2)
- {
- if (exp1.Method != exp2.Method)
- return false;
- if (!EqualsCompare(exp1.Left, exp2.Left))
- return false;
- if (!EqualsCompare(exp1.Right, exp2.Right))
- return false;
- return true;
- }
- }
- }
|