protected override Expression VisitConditional(ConditionalExpression node)
        {
            bool condition = (bool)ExpressionEntry.GetConstantByExpression(node.Test);

            if (condition)
            {
                Value = ExpressionEntry.GetConstantByExpression(node.IfTrue);
            }
            else
            {
                Value = ExpressionEntry.GetConstantByExpression(node.IfFalse);
            }
            return(node);
        }
Exemplo n.º 2
0
        protected override Expression VisitBinary(BinaryExpression node)
        {
            object     left       = ExpressionEntry.GetConstantByExpression(node.Left);
            object     right      = ExpressionEntry.GetConstantByExpression(node.Right);
            MethodInfo methodInfo = node.Method;

            if (methodInfo.IsStatic)
            {
                Value = methodInfo.Invoke(null, new object[] { left, right });
            }
            else
            {
                Value = methodInfo.Invoke(left, new object[] { right });
            }

            return(node);
        }
        protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            string symbol = string.Empty;

            switch (node.Method.Name)
            {
            case "Equals":
                symbol = "= {0}";
                break;

            case "StartsWith":
                symbol = "like {0}'%'";
                break;

            case "EndsWith":
                symbol = "like '%'{0}";
                break;

            case "Contains":
                symbol = "like '%'{0}'%'";
                break;

            default:
                throw new NotSupportedException($"Not support method name:{node.Method.Name}");
            }

            if (node.Object is MemberExpression)
            {
                MemberExpressionVisitor memberExpressionVisitor = new MemberExpressionVisitor(NonParametric, Parameters, SqlAdapter);
                memberExpressionVisitor.Visit(node.Object);
                string fieldName     = memberExpressionVisitor.GetResult().ToString();
                string parameterName = EnsurePatameter(memberExpressionVisitor.MemberInfo);
                string sql           = string.Format($"{fieldName} {symbol}", $"@{parameterName}");
                sb.Append(sql);
                Parameters.Add($"@{parameterName}", ExpressionEntry.GetConstantByExpression(node.Arguments[0]));
            }

            return(node);
        }
        protected override Expression VisitBinary(BinaryExpression node)
        {
            if (node.Left is MemberExpression && IsDataComparator(node.NodeType))
            {
                sb.Append(InternalGetSqlByExpression(node));
            }
            else if (IsLogicType(node.NodeType))
            {
                var leftClause = ExpressionEntry.GetWhereClauseByExpression(node.Left, Parameters, NonParametric, SqlAdapter);
                sb.Append($"({leftClause})");

                sb.Append($" {ConvertExpressionTypeToSymbol(node.NodeType)} ");

                var rightClause = ExpressionEntry.GetWhereClauseByExpression(node.Right, Parameters, NonParametric, SqlAdapter);
                sb.Append($"({rightClause})");
            }
            else
            {
                throw new NotSupportedException($"Unknow Left:{node.Left.GetType()} Right:{node.Right.GetType()} NodeType:{node.NodeType}");
            }
            return(node);
        }
        protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            MethodInfo mi       = node.Method;
            object     instance = null;

            object[] parameters = null;
            if (node.Object != null)
            {
                instance = ExpressionEntry.GetConstantByExpression(node.Object);
            }
            if (node.Arguments != null && node.Arguments.Count > 0)
            {
                parameters = new object[node.Arguments.Count];
                for (int i = 0; i < node.Arguments.Count; i++)
                {
                    Expression expression = node.Arguments[i];
                    parameters[i] = ExpressionEntry.GetConstantByExpression(expression);
                }
            }

            Value = mi.Invoke(instance, parameters);

            return(node);
        }