public static string FindPropertyExpression(Expression expression, ParameterOption option)
 {
     string memberExpression = FindMemberExpression(expression, option);
     int periodPosition = memberExpression.LastIndexOf('.') + 1;
     string property = (periodPosition <= 0) ? memberExpression : memberExpression.Substring(periodPosition);
     return property;
 }
        public static CriteriaOperator FindMemberOperator(Expression expression, ParameterOption option)
        {
            if (!IsMemberExpression(expression))
                return new OperandValue(FindValue(expression));

            if (expression is UnaryExpression)
            {
                UnaryExpression unaryExpression = (UnaryExpression)expression;

                if (unaryExpression.NodeType != ExpressionType.Convert)
                    throw new Exception("Cannot interpret member from " + expression.ToString());

                return FindMemberOperator(unaryExpression.Operand, option);
            }

            return new OperandProperty(FindMemberExpression(expression, option));
        }
 public static string FindPropertyExpression(Expression expression)
 {
     ParameterOption option = new ParameterOption();
     return FindPropertyExpression(expression, option);
 }
        private static CriteriaOperator ProcessVisualBasicStringComparison(BinaryExpression be, ParameterOption option)
        {
            var methodCall = (MethodCallExpression)be.Left;

            if (IsMemberExpression(methodCall.Arguments[1]))
                return ProcessMemberExpression(methodCall.Arguments[0], methodCall.Arguments[1], be.NodeType, option);
            else
                return ProcessSimpleExpression(methodCall.Arguments[0], methodCall.Arguments[1], be.NodeType, option);
        }
        private static CriteriaOperator ProcessSimpleExpression(Expression left, Expression right, ExpressionType nodeType, ParameterOption option)
        {
            CriteriaOperator property = FindMemberOperator(left, option);
            System.Type propertyType = FindMemberType(left);

            object value = FindValue(right);
            value = ConvertType(value, propertyType);

            return new BinaryOperator(property, new OperandValue(value), GetBinaryType(nodeType));
        }
        private static CriteriaOperator ProcessSimpleExpression(BinaryExpression be, ParameterOption option)
        {
            if (be.Left.NodeType == ExpressionType.Call && ((MethodCallExpression)be.Left).Method.Name == "CompareString")
                return ProcessVisualBasicStringComparison(be, option);

            return ProcessSimpleExpression(be.Left, be.Right, be.NodeType, option);
        }
 private static CriteriaOperator ProcessOrExpression(BinaryExpression expression, ParameterOption option)
 {
     return new GroupOperator(GroupOperatorType.Or, ProcessExpression(expression.Left, option), ProcessExpression(expression.Right, option));
 }
        private static string FindMemberExpression(Expression expression, ParameterOption option)
        {
            if (expression is MemberExpression)
            {
                MemberExpression memberExpression = (MemberExpression)expression;

                if (memberExpression.Expression.NodeType == ExpressionType.MemberAccess
                    || memberExpression.Expression.NodeType == ExpressionType.Call)
                {
                    if (IsNullableOfT(memberExpression.Member.DeclaringType))
                    {
                        // it's a Nullable<T>, so ignore any .Value
                        if (memberExpression.Member.Name == "Value")
                            return FindMemberExpression(memberExpression.Expression, new ParameterOption());
                    }
                    return FindMemberExpression(memberExpression.Expression, new ParameterOption()) + "." + memberExpression.Member.Name;
                    //return FindMemberExpression(memberExpression.Expression, option) + "." + memberExpression.Member.Name;
                }
                else if (memberExpression.Expression.NodeType == ExpressionType.Convert)
                {
                    return (FindMemberExpression(memberExpression.Expression, new ParameterOption()) + "." + memberExpression.Member.Name).TrimStart('.');
                }
                else if (option.WithParameter)
                {
                    if (option.TypeFormat.ContainsKey(memberExpression.Expression.Type))
                        return option.TypeFormat[memberExpression.Expression.Type].FormatArgs(memberExpression.Member.Name);
                    return (memberExpression.Expression + "." + memberExpression.Member.Name).TrimStart('.');
                }
                else
                {
                    return memberExpression.Member.Name;
                }
            }

            if (expression is UnaryExpression)
            {
                UnaryExpression unaryExpression = (UnaryExpression)expression;

                if (unaryExpression.NodeType != ExpressionType.Convert)
                    throw new Exception("Cannot interpret member from " + expression.ToString());

                return FindMemberExpression(unaryExpression.Operand, option);
            }

            if (expression is MethodCallExpression)
            {
                MethodCallExpression methodCallExpression = (MethodCallExpression)expression;

                if (methodCallExpression.Method.Name == "GetType")
                    return ClassMember(methodCallExpression.Object, option);

                if (methodCallExpression.Method.Name == "get_Item")
                    return FindMemberExpression(methodCallExpression.Object, option);

                if (methodCallExpression.Method.Name == "First")
                    return FindMemberExpression(methodCallExpression.Arguments[0], option);

                throw new Exception("Unrecognised method call in expression " + expression.ToString());
            }

            if (expression is ParameterExpression)
                return "";

            throw new Exception("Could not determine member from " + expression.ToString());
        }
 public static CriteriaOperator FindMemberOperator(Expression expression)
 {
     ParameterOption option = new ParameterOption();
     return FindMemberOperator(expression, option);
 }
示例#10
0
        private static CriteriaOperator ProcessMemberExpression(Expression left, Expression right, ExpressionType nodeType, ParameterOption option)
        {
            CriteriaOperator leftProperty = FindMemberOperator(left, option);
            CriteriaOperator rightProperty = FindMemberOperator(right, option);

            return new BinaryOperator(leftProperty, rightProperty, GetBinaryType(nodeType));
        }
示例#11
0
 private static CriteriaOperator ProcessMemberExpression(BinaryExpression be, ParameterOption option)
 {
     return ProcessMemberExpression(be.Left, be.Right, be.NodeType, option);
 }
示例#12
0
        private static CriteriaOperator ProcessExpression(Expression expression, ParameterOption option)
        {
            if (expression is NewArrayExpression)
                return ProcessNewArrayExpression((NewArrayExpression)expression, option);
            if (expression is BinaryExpression)
                return ProcessBinaryExpression((BinaryExpression)expression, option);

            return ProcessBooleanExpression((Expression)expression, option);
        }
示例#13
0
        private static CriteriaOperator ProcessBooleanExpression(Expression expression, ParameterOption option)
        {
            if (expression is MemberExpression)
            {
                return new BinaryOperator(FindMemberExpression(expression, option), true);
            }

            if (expression is UnaryExpression)
            {
                UnaryExpression unaryExpression = (UnaryExpression)expression;

                if (unaryExpression.NodeType != ExpressionType.Not)
                    throw new Exception("Cannot interpret member from " + expression.ToString());

                if (IsMemberExpression(unaryExpression.Operand))
                    return new BinaryOperator(FindMemberExpression(unaryExpression.Operand, option), false);
                else
                    return ProcessExpression(unaryExpression.Operand, option).Not();
            }

            var methodCallExpression = expression as MethodCallExpression;
            if (methodCallExpression != null)
            {
                return ProcessCustomMethodCall(methodCallExpression);
            }

            if (expression is TypeBinaryExpression)
            {
                TypeBinaryExpression typeBinaryExpression = (TypeBinaryExpression)expression;
                return new BinaryOperator(ClassMember(typeBinaryExpression.Expression, option), typeBinaryExpression.TypeOperand.FullName);
            }

            throw new Exception("Could not determine member type from " + expression.NodeType + ", " + expression.ToString() + ", " + expression.GetType());
        }
示例#14
0
        private static CriteriaOperator ProcessBinaryExpression(BinaryExpression expression, ParameterOption option)
        {
            switch (expression.NodeType)
            {
                case ExpressionType.AndAlso:
                    return ProcessAndExpression(expression, option);

                case ExpressionType.OrElse:
                    return ProcessOrExpression(expression, option);

                case ExpressionType.Equal:
                case ExpressionType.NotEqual:
                case ExpressionType.GreaterThan:
                case ExpressionType.GreaterThanOrEqual:
                case ExpressionType.LessThan:
                case ExpressionType.LessThanOrEqual:
                    if (IsMemberExpression(expression.Right))
                        return ProcessMemberExpression(expression, option);
                    else
                        return ProcessSimpleExpression(expression, option);

                default:
                    throw new Exception("Unhandled binary expression: " + expression.NodeType + ", " + expression.ToString());
            }
        }
示例#15
0
        private static CriteriaOperator ProcessNewArrayExpression(NewArrayExpression newArrayExpression, ParameterOption option)
        {
            var criteria = new GroupOperator(GroupOperatorType.Or);
            foreach (var e in newArrayExpression.Expressions)
                criteria.Operands.Add(FindMemberOperator(e, option));

            return criteria;
        }
示例#16
0
 public static CriteriaOperator ProcessLambdaExpression(LambdaExpression expression, bool withParameter = false)
 {
     ParameterOption option = new ParameterOption();
     option.WithParameter = withParameter;
     option.TypeFormat = new Dictionary<Type, string>();
     if (withParameter && expression.Parameters.Count > 0)
     {
         var p = expression.Parameters[0];
         option.TypeFormat.Add(p.Type, "domain.{0}");
     }
     return ProcessExpression(expression.Body, option);
 }
示例#17
0
 private static string ClassMember(Expression expression, ParameterOption option)
 {
     if (expression.NodeType == ExpressionType.MemberAccess)
         return FindMemberExpression(expression, option) + ".class";
     else
         return "class";
 }