Пример #1
0
        /// <summary> 解释与字符串类型相关的方法,并将方法分配给指定的方法
        /// </summary>
        private string ParseStringMethod(MethodInfo method, ISawDust target, ISawDust[] args)
        {
            switch (method.Name)
            {
            case "Trim":
                return(StringTrim(target.ToSql(), GetTrimArg(args, 0)));

            case "TrimEnd":
                return(StringTrimEnd(target.ToSql(), GetTrimArg(args, 0)));

            case "TrimStart":
                return(StringTrimStart(target.ToSql(), GetTrimArg(args, 0)));

            case "IsNullOrWhiteSpace":
                return(StringIsNullOrWhiteSpace(args[0].ToSql()));

            case "IsNullOrEmpty":
                return(StringIsNullOrEmpty(args[0].ToSql()));

            case "ToString":
                return(target.ToSql());

            default:
                break;
            }
            return(null);
        }
Пример #2
0
        /// <summary> 解释与字符类型相关的方法,并将方法分配给指定的方法
        /// </summary>
        private string ParseCharMethod(MethodInfo method, ISawDust target, ISawDust[] args)
        {
            switch (method.Name)
            {
            case "Parse":
                return(args[0].ToSql());

            case "ToString":
                return(target.ToSql());

            default:
                break;
            }
            return(null);
        }
Пример #3
0
        public string ParseProperty(PropertyInfo property, ISawDust target)
        {
            AreNull(property, "property");
            if (property.ReflectedType == typeof(DateTime))
            {
                switch (property.Name)
                {
                case "Year":
                    return(DateTimeToField(target.ToSql(), DateTimeField.Year));

                case "Month":
                    return(DateTimeToField(target.ToSql(), DateTimeField.Month));

                case "Day":
                    return(DateTimeToField(target.ToSql(), DateTimeField.Day));

                case "Hour":
                    return(DateTimeToField(target.ToSql(), DateTimeField.Hour));

                case "Minute":
                    return(DateTimeToField(target.ToSql(), DateTimeField.Minute));

                case "Second":
                    return(DateTimeToField(target.ToSql(), DateTimeField.Second));

                case "DayOfWeek":
                    return(DateTimeToField(target.ToSql(), DateTimeField.Week));

                default:
                    break;
                }
                return(null);
            }
            else if (property.ReflectedType == typeof(string))
            {
                if (property.Name == "Length")
                {
                    return(StringLength(target.ToSql()));
                }
            }
            return(ParseMember(property, target, new ISawDust[0]));
        }
Пример #4
0
        /// <summary> 将.NET中的方法解释为sql表达式
        /// </summary>
        /// <param name="method">需解释的方法</param>
        /// <param name="target">方法调用者</param>
        /// <param name="args">方法参数</param>
        /// <returns></returns>
        public string ParseMethod(MethodInfo method, ISawDust target, ISawDust[] args)
        {
            AreNull(method, "method");
            string sql = null;

            switch (Type.GetTypeCode(Nullable.GetUnderlyingType(method.ReflectedType) ?? method.ReflectedType))
            {
            case TypeCode.Char:
                sql = ParseCharMethod(method, target, args);
                break;

            case TypeCode.String:
                sql = ParseStringMethod(method, target, args);
                break;

            case TypeCode.DateTime:
                sql = ParseDateTimeMethod(method, target, args);
                break;

            case TypeCode.Byte:
            case TypeCode.Decimal:
            case TypeCode.Double:
            case TypeCode.Int16:
            case TypeCode.Int32:
            case TypeCode.Int64:
            case TypeCode.SByte:
            case TypeCode.Single:
            case TypeCode.UInt16:
            case TypeCode.UInt32:
            case TypeCode.UInt64:
                sql = ParseNumberMethod(method, target, args);
                break;

            default:
                break;
            }

            return(sql ?? ParseMember(method, target, args));
        }
Пример #5
0
        /// <summary> 解释与时间类型相关的方法,并将方法分配给指定的方法
        /// </summary>
        private string ParseDateTimeMethod(MethodInfo method, ISawDust target, ISawDust[] args)
        {
            switch (method.Name)
            {
            case "Parse":
                return(ObjectToString(DustType.DateTime, target.ToSql(), null));

            case "ParseExact":
                var format = args[0].Value as string;
                if (format != null && format.Contains("'"))
                {
                    format = format.Replace("'", "''");
                }
                return(ObjectToString(DustType.DateTime, args[0].ToSql(), "'" + format + "'"));

            case "ToString":
                if (args.Length == 0)
                {
                    return(ObjectToString(DustType.DateTime, target.ToSql(), null));
                }
                format = args[0].Value as string;
                if (format != null && format.Contains("'"))
                {
                    format = format.Replace("'", "''");
                }
                return(ObjectToString(DustType.DateTime, target.ToSql(), "'" + format + "'"));

            case "ToShortTimeString":
                return(ObjectToString(DustType.DateTime, target.ToSql(), "'HH:mm'"));

            case "ToShortDateString":
                return(ObjectToString(DustType.DateTime, target.ToSql(), "'yyyy-MM-dd'"));

            default:
                break;
            }
            return(null);
        }
Пример #6
0
        /// <summary> 解释与数字类型相关的方法,并将方法分配给指定的方法
        /// </summary>
        private string ParseNumberMethod(MethodInfo method, ISawDust target, ISawDust[] args)
        {
            switch (method.Name)
            {
            case "Parse":
                return(SrtingToNumber(args[0].ToSql()));

            case "ToString":
                if (args.Length == 0)
                {
                    return(ObjectToString(DustType.Number, target.ToSql(), null));
                }
                var format = args[0].Value as string;
                if (format != null && format.Contains("'"))
                {
                    format = format.Replace("'", "''");
                }
                return(ObjectToString(DustType.Number, target.ToSql(), "'" + format + "'"));

            default:
                break;
            }
            return(null);
        }
Пример #7
0
 /// <summary> 解释其他方法,可重写
 /// </summary>
 /// <param name="method">需解释的方法</param>
 /// <param name="target">方法调用者</param>
 /// <param name="args">方法参数</param>
 protected virtual string ParseMember(MemberInfo member, ISawDust target, ISawDust[] args)
 {
     throw new NotSupportedException("无法解释方法:" + member.ToString());
 }
Пример #8
0
 public string ParseField(FieldInfo field, ISawDust target)
 {
     return(ParseMember(field, target, new ISawDust[0]));
 }
Пример #9
0
 private void Parse(NewExpression expr)
 {
     var length = expr.Arguments.Count;
     var arr = new ISawDust[length];
     for (int i = 0; i < length; i++)
     {
         var column = expr.Arguments[i];
         var member = column as MemberExpression;
         var alias = expr.Members[i];
         Parse(column);
         if (member == null || member.Member.Name != alias.Name)
         {
             _state.Sql = _saw.GetColumn(GetSql(), alias.Name);
         }
         arr[i] = GetSawDust();
     }
     _state.Array = arr;
 }
Пример #10
0
 private void Parse(NewArrayExpression expr)
 {
     var exps = expr.Expressions;
     var length = expr.Expressions.Count;
     var arr = Array.CreateInstance(expr.Type.GetElementType(), length);
     for (int i = 0; i < length; i++)
     {
         Parse(exps[i]);
         if (_state.DustType != DustType.Sql)
         {
             arr.SetValue(_state.Object, i);
         }
         else
         {
             var arr1 = new ISawDust[length];
             var dust = GetSawDust();
             if (i > 0)
             {
                 _state.Object = arr.GetValue(0);
                 arr1[0] = new SawDust(this, _state.DustType, arr.GetValue(0));
                 for (int j = 1; j < i; j++)
                 {
                     arr1[j] = new SawDust(this, _state.DustType, arr.GetValue(j));
                 }
             }
             for (; i < length; i++)
             {
                 Parse(exps[i]);
                 arr1[i] = GetSawDust();
             }
             _state.Array = arr1;
             return;
         }
     }
     _state.Array = arr;
 }
Пример #11
0
        /// <summary> 解析方法,如果全部是常量,则直接执行
        /// </summary>
        /// <param name="expr">方法表达式</param>
        /// <param name="target">方法的调用实例</param>
        /// <param name="args">方法参数</param>
        /// <returns></returns>
        private bool TryInvoke(MethodCallExpression expr, out ISawDust target, out ISawDust[] args)
        {
            ISubExpression subexpr = null;
            //判断方法调用实例,如果是null为静态方法,反之为实例方法
            if (expr.Object == null)
            {
                target = new SawDust(this, DustType.Object, null);
            }
            else
            {
                Parse(expr.Object);
                if (_state.DustType == DustType.SubExpression) subexpr = _state.SubExpression;
                target = GetSawDust();
            }

            var exprArgs = expr.Arguments;
            var length = exprArgs.Count;
            args = new ISawDust[length];
            var call = target.Type != DustType.Sql;
            for (int i = 0; i < length; i++)
            {
                Parse(exprArgs[i]);
                if (_state.DustType == DustType.Sql)
                {
                    if (call) call = false;
                    args[i] = new SawDust(this, DustType.Sql, _state.Sql);
                }
                else if (_state.DustType == DustType.Array && _state.Array is ISawDust[])
                {
                    if (call) call = false;
                    args[i] = new SawDust(this, DustType.Array, _state.Array);
                }
                else
                {
                    args[i] = new SawDust(this, _state.DustType, _state.Object);
                }
            }

            if (call)
            {
                var method = expr.Method;
                if (subexpr != null && !TypesHelper.IsChild(typeof(ISubExpression), method.ReturnType))
                {
                    _state.Sql = subexpr.GetSqlString(args);
                }
                else
                {
                    _state.Object = method.Invoke(target.Value, args.Select(it => it.Value).ToArray());
                }
                return true;
            }
            else
            {
                return false;
            }
        }
Пример #12
0
 private bool ParseStringMethod(MethodInfo method, ISawDust target, ISawDust[] args)
 {
     if (args.Length >= 1)
     {
         BinaryOperator opt;
         switch (method.Name)
         {
             case "StartsWith":
                 opt = _state.UnaryNot ? BinaryOperator.NotStartWith : BinaryOperator.StartWith;
                 break;
             case "EndsWith":
                 opt = _state.UnaryNot ? BinaryOperator.NotEndWith : BinaryOperator.EndWith;
                 break;
             case "Contains":
                 opt = _state.UnaryNot ? BinaryOperator.NotContains : BinaryOperator.Contains;
                 break;
             default:
                 return false;
         }
         _state.Sql = _saw.BinaryOperation(target.ToSql(), opt, args[0].ToSql());
         return true;
     }
     return false;
 }