Exemplo n.º 1
0
        private SqlMember ResolveMethodEndsWith(MethodCallExpression exp)
        {
            StringBuilder       builder   = new StringBuilder();
            List <SqlParameter> paramList = new List <SqlParameter>();

            if (exp.Object != null)
            {
                SqlMember sqlMember = Resolve(exp.Object);
                builder.Append(sqlMember.Value);
                if (sqlMember.ParamList != null)
                {
                    paramList.AddRange(sqlMember.ParamList);
                }
            }
            builder.Append(" LIKE  ");
            if (exp.Arguments != null)
            {
                foreach (var item in exp.Arguments)
                {
                    SqlMember sqlMember = Resolve(item);
                    builder.Append(sqlMember.Value);
                    if (sqlMember.ParamList != null)
                    {
                        paramList.AddRange(sqlMember.ParamList);
                    }
                }
            }
            builder.Append(" +'%' ");
            return(new SqlMember(builder.ToString(), SqlMemberType.None, paramList));
        }
Exemplo n.º 2
0
        private SqlMember VisitMemberAccess(MemberExpression exp)
        {
            LogUtil.Info(exp.Member.Name);
            SqlMemberType       sqlMemberType = default(SqlMemberType);
            List <SqlParameter> paramList     = new List <SqlParameter>();
            object value = null;

            if (IsNotParameterExpression(exp))
            {
                var memberValue = Expression.Lambda(exp).Compile().DynamicInvoke();
                sqlMemberType = SqlMemberType.Value;
                var memberValueType = memberValue.GetType();
                if (memberValueType.IsArray || memberValueType.IsGenericType)
                {
                    foreach (var item in (IEnumerable)memberValue)
                    {
                        paramList.Add(GetSqlParameter(item, item.GetType()));
                    }
                    value = string.Concat("(", string.Join(",", paramList.Select(m => m.ParameterName)), ")");
                }
                else
                {
                    var sqlParameter = GetSqlParameter(memberValue, memberValue.GetType());
                    paramList.Add(sqlParameter);
                    value = sqlParameter.ParameterName;
                }
            }
            else
            {
                if (exp.Member.Name == "Length")
                {
                    SqlMember memberSqlMember = Resolve(exp.Expression);
                    value         = $"LEN({memberSqlMember.Value})";
                    sqlMemberType = SqlMemberType.Key;
                    if (memberSqlMember.ParamList != null)
                    {
                        paramList.AddRange(memberSqlMember.ParamList);
                    }
                }
                if (exp.Member.Name == "Count")
                {
                    throw new NotSupportedException("Count");
                }
                else
                {
                    value         = exp.Member.Name;
                    sqlMemberType = SqlMemberType.Key;
                }
            }
            return(new SqlMember(value, sqlMemberType, paramList));
        }
Exemplo n.º 3
0
        private SqlMember ResolveMethodTrim(MethodCallExpression exp)
        {
            StringBuilder       builder   = new StringBuilder("RTRIM(LTRIM(");
            List <SqlParameter> paramList = new List <SqlParameter>();

            if (exp.Object != null)
            {
                SqlMember sqlMember = Resolve(exp.Object);
                builder.Append(sqlMember.Value);
                if (sqlMember.ParamList != null)
                {
                    paramList.AddRange(sqlMember.ParamList);
                }
            }
            builder.Append(")");
            return(new SqlMember(builder.ToString(), SqlMemberType.Key, paramList));
        }
Exemplo n.º 4
0
        private SqlMember ResolveMethodContains(MethodCallExpression exp)
        {
            var rightExpType = exp.Arguments[0].NodeType;

            LogUtil.Debug($"RightType:{rightExpType}");
            Expression leftExp  = exp.Object ?? exp.Arguments[1];
            Expression rightExp = null;

            if (new ExpressionType[] { ExpressionType.MemberAccess, ExpressionType.Constant }.Contains(rightExpType))
            {
                rightExp = exp.Arguments[0];
            }
            else
            {
                rightExp = Expression.Lambda(exp.Arguments[0]);
            }
            StringBuilder       builder         = new StringBuilder();
            List <SqlParameter> paramList       = new List <SqlParameter>();
            SqlMember           leftSqlMember   = Resolve(leftExp);
            SqlMember           rightSqlMEember = Resolve(rightExp);

            if (leftSqlMember.ParamList != null && leftSqlMember.ParamList.Count > 1)//是个数组或者集合
            {
                builder.AppendFormat("{0} IN {1}", rightSqlMEember.Value, leftSqlMember.Value);
            }
            else if (rightSqlMEember.ParamList != null && rightSqlMEember.ParamList.Count > 1)
            {
                builder.AppendFormat("{0} IN {1}", leftSqlMember.Value, rightSqlMEember.Value);
            }
            else
            {
                builder.AppendFormat(" {0} LIKE '%'+{1}+'%' ", leftSqlMember.Value, rightSqlMEember.Value);
            }
            if (leftSqlMember.ParamList != null)
            {
                paramList.AddRange(leftSqlMember.ParamList);
            }
            if (rightSqlMEember.ParamList != null)
            {
                paramList.AddRange(rightSqlMEember.ParamList);
            }
            return(new SqlMember(builder.ToString(), SqlMemberType.None, paramList));
        }
Exemplo n.º 5
0
        private SqlMember AppendSqlMember(SqlMember leftSqlMember, ExpressionType expType, SqlMember rightSqlMember)
        {
            SqlMemberType       memberType = SqlMemberType.None;
            StringBuilder       builder    = new StringBuilder();
            List <SqlParameter> paramList  = new List <SqlParameter>();

            if (leftSqlMember.ParamList != null)
            {
                paramList.AddRange(leftSqlMember.ParamList);
            }
            if (rightSqlMember.ParamList != null)
            {
                paramList.AddRange(rightSqlMember.ParamList);
            }

            if (expType == ExpressionType.Coalesce)
            {
                builder.AppendFormat("ISNULL({0},{1})", leftSqlMember.MemberType == SqlMemberType.Value ? rightSqlMember.Value : leftSqlMember.Value, leftSqlMember.MemberType == SqlMemberType.Value ? leftSqlMember.Value : rightSqlMember.Value);
                memberType = SqlMemberType.Key;
            }
            else
            {
                if (leftSqlMember.MemberType == rightSqlMember.MemberType && leftSqlMember.MemberType == SqlMemberType.None)
                {
                    builder.AppendFormat("({0} {1} {2})", leftSqlMember.Value, ResolveExpressionType(expType), rightSqlMember.Value);
                }
                else if (leftSqlMember.MemberType == SqlMemberType.None || rightSqlMember.MemberType == SqlMemberType.None)
                {
                    builder.AppendFormat("({0} {1} {2}) ", leftSqlMember.MemberType == SqlMemberType.None ? leftSqlMember.Value : leftSqlMember.Value + "=1", ResolveExpressionType(expType), rightSqlMember.MemberType == SqlMemberType.None ? rightSqlMember.Value : rightSqlMember.Value + "=1");
                }
                else
                {
                    builder.AppendFormat("({0} {1} {2})", leftSqlMember.Value, ResolveExpressionType(expType), rightSqlMember.Value);
                }
            }
            return(new SqlMember(builder.ToString(), memberType, paramList));
        }
Exemplo n.º 6
0
        public SqlMember Resolve(Expression exp)
        {
            if (exp == null)
            {
                return(default(SqlMember));
            }
            LogUtil.Debug($"NodeType:{exp.NodeType.ToString()}");
            SqlMember sqlMember = default(SqlMember);

            switch (exp.NodeType)
            {
            case ExpressionType.Negate:
            case ExpressionType.NegateChecked:
            case ExpressionType.Not:
            case ExpressionType.Convert:
            case ExpressionType.ConvertChecked:
            case ExpressionType.ArrayLength:
            case ExpressionType.Quote:
            case ExpressionType.TypeAs:
                sqlMember = this.VisitUnary((UnaryExpression)exp);
                break;

            case ExpressionType.Add:
            case ExpressionType.AddChecked:
            case ExpressionType.Subtract:
            case ExpressionType.SubtractChecked:
            case ExpressionType.Multiply:
            case ExpressionType.MultiplyChecked:
            case ExpressionType.Divide:
            case ExpressionType.Modulo:
            case ExpressionType.And:
            case ExpressionType.AndAlso:
            case ExpressionType.Or:
            case ExpressionType.OrElse:
            case ExpressionType.LessThan:
            case ExpressionType.LessThanOrEqual:
            case ExpressionType.GreaterThan:
            case ExpressionType.GreaterThanOrEqual:
            case ExpressionType.Equal:
            case ExpressionType.NotEqual:
            case ExpressionType.Coalesce:
            case ExpressionType.ArrayIndex:
            case ExpressionType.RightShift:
            case ExpressionType.LeftShift:
            case ExpressionType.ExclusiveOr:
                sqlMember = this.VisitBinary((BinaryExpression)exp);
                break;

            case ExpressionType.TypeIs:
                throw new NotSupportedException(exp.NodeType.ToString());

            case ExpressionType.Conditional:
                sqlMember = this.VisitConditional((ConditionalExpression)exp);
                break;

            case ExpressionType.Constant:
                sqlMember = this.VisitConstant((ConstantExpression)exp);
                break;

            case ExpressionType.Parameter:
                throw new NotSupportedException(exp.NodeType.ToString());

            case ExpressionType.MemberAccess:
                sqlMember = VisitMemberAccess((MemberExpression)exp);
                break;

            case ExpressionType.Call:
                sqlMember = VisitMethodCall((MethodCallExpression)exp);
                break;

            case ExpressionType.Lambda:
                throw new NotSupportedException(exp.NodeType.ToString());

            case ExpressionType.New:
                throw new NotSupportedException(exp.NodeType.ToString());

            case ExpressionType.NewArrayInit:
            case ExpressionType.NewArrayBounds:
                throw new NotSupportedException(exp.NodeType.ToString());

            case ExpressionType.Invoke:
                throw new NotSupportedException(exp.NodeType.ToString());

            case ExpressionType.MemberInit:
                throw new NotSupportedException(exp.NodeType.ToString());

            case ExpressionType.ListInit:
                throw new NotSupportedException(exp.NodeType.ToString());

            default:
                throw new NotSupportedException(exp.NodeType.ToString());
            }
            return(sqlMember);
        }