Exemplo n.º 1
0
 string FormatDateConverter(ColumnConverter columnConverter, string converter, string unit, string value)
 {
     if (columnConverter.IsInstanceColumn)
     {
         if (string.IsNullOrWhiteSpace(value))
         {
             converter = string.Format(converter, string.Format("DATE({0},{1} ' {2}')", "{0}", value, unit));
         }
         else
         {
             converter = string.Format(converter, string.Format("DATE({0},{1} || ' {2}')", "{0}", value, unit));
         }
     }
     else
     {
         converter = string.Format(converter, string.Format("DATE('{0}',{1} || ' {2}')", value, "{0}", unit));
     }
     return converter;
 }
 protected override Expression VisitMethodCall(MethodCallExpression node)
 {
     var argsExp = node.Arguments;
     var args = new List<Token>();
     foreach (var argExp in argsExp)
     {
         args.Add(ParseArgument(argExp));
     }
     if (node.Object == null)
     {
         //静态方法调用var col = (Token)body.Result;
         var method = node.Method;
         if (_isColumn)
         {
             //string converter = "{0}";
             var parameters = new List<object>();
             switch (method.Name)
             {
                 case "ToDateTime":
                     //if (method.DeclaringType != typeof(Convert) || argsExp.Count != 1)
                     //{
                     //    throw new Exception("不支持");
                     //}
                     Token = (Token)args[0];
                     parameters.AddRange(args.Skip(1));
                     //converter = Token.Column.Converter;
                     //if (string.IsNullOrWhiteSpace(converter))
                     //{
                     //    converter = "{0}";
                     //}
                     //switch (Token.Type)
                     //{
                     //    case TokenType.Column:
                     //        converter = string.Format(converter, "CONVERT(DATETIME,{0},211)");
                     //        Token.Column.Converter = converter;
                     //        break;
                     //    default:
                     //        throw new Exception();
                     //}
                     break;
                 case "Contains":
                     Token = (Token)args[1];
                     //var list = ((Token)args[0]).Object as IList<int>;
                     parameters.Add(args[0].Object);
                     parameters.AddRange(args.Skip(2).Where(x => x.Type == TokenType.Object).Select(x => x.Object));
                     //if (method.DeclaringType != typeof(Enumerable))
                     //{
                     //    throw new Exception("不支持");
                     //}
                     //converter = string.Format(converter, "{0} in (" + string.Join(",", list) + ")");
                     //Token.Column.Converter = converter;
                     break;
                 default:
                     throw new Exception();
             }
             var converter = new ColumnConverter(method, parameters);
             Token.Column.Converters.Push(converter);
         }
         else
         {
             Token = Token.Create(node.Method.Invoke(null, args.Select(x => x.Object).ToArray()));
         }
     }
     else
     {
         var body = new MemberExpressionVisitor(Context);
         body.Visit(node.Object);
         if (body.Token.Type == TokenType.Column && !_isColumn)
         {
             //实例对象是列,参数不是列
             Token = body.Token;
             //string converter = Token.Column.Converter;
             //if (string.IsNullOrWhiteSpace(converter))
             //{
             //    converter = "{0}";
             //}
             var method = node.Method;
             var argObjects = args.Select(x => x.Object);
             //Token.Column.ConverterParameters.AddRange(argObjects);
             Token.Column.Converters.Push(new ColumnConverter(method, argObjects.ToList(), true));
             //switch (method.Name)
             //{
             //    case "ToDateTime":
             //        if (method.DeclaringType != typeof(Convert) || argsExp.Count != 1)
             //        {
             //            throw new Exception("不支持");
             //        }
             //        converter = string.Format(converter, "CONVERT(DATETIME,{0},211)");
             //        break;
             //    case "Substring":
             //        if (method.DeclaringType != typeof(string))
             //        {
             //            throw new Exception("不支持");
             //        }
             //        if (argsExp.Count == 1)
             //        {
             //            //SubString(startIndex)
             //            ExpressionVisitorBase visitor = new PropertyFieldExpressionVisitor(Context);
             //            visitor.Visit(argsExp[0]);
             //            if (visitor.Token.Type != TokenType.Object)
             //            {
             //                throw new Exception("不支持");
             //            }
             //            converter = string.Format(converter, "SUBSTRING({0}," + (Convert.ToInt32(argObjects[0]) + 1) + ",LEN({0})+1-" + Convert.ToInt32(visitor.Token.Object) + ")");
             //        }
             //        else if (argsExp.Count == 2)
             //        {
             //            //SubString(startIndex,length)
             //            ExpressionVisitorBase startVisitor = new PropertyFieldExpressionVisitor(Context);
             //            startVisitor.Visit(argsExp[0]);
             //            if (startVisitor.Token.Type != TokenType.Object)
             //            {
             //                throw new Exception("不支持");
             //            }
             //            ExpressionVisitorBase lenVistior = new PropertyFieldExpressionVisitor(Context);
             //            lenVistior.Visit(argsExp[1]);
             //            if (lenVistior.Token.Type != TokenType.Object)
             //            {
             //                throw new Exception("不支持");
             //            }
             //            converter = string.Format(converter, "SUBSTRING({0}," + (Convert.ToInt32(startVisitor.Token.Object) + 1) + "," + Convert.ToInt32(lenVistior.Token.Object) + ")");
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "Contains":
             //        if (method.DeclaringType == typeof(string))
             //        {
             //            converter = string.Format(converter, "CHARINDEX(@param1,{0})>0");
             //            Token.Column.ConverterParameters.AddRange(argObjects);
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "StartsWith":
             //        if (method.DeclaringType == typeof(string))
             //        {
             //            converter = string.Format(converter, "CHARINDEX(@param1,{0})=1");
             //            Token.Column.ConverterParameters.AddRange(argObjects);
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddDays":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(DAY,@param1,{0})");
             //            Token.Column.ConverterParameters.AddRange(argObjects);
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddHours":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(HOUR,@param1,{0})");
             //            Token.Column.ConverterParameters.AddRange(argObjects);
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddMilliseconds":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(MILLISECOND,@param1,{0})");
             //            Token.Column.ConverterParameters.AddRange(argObjects);
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddMinutes":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(MINUTE,@param1,{0})");
             //            Token.Column.ConverterParameters.AddRange(argObjects);
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddMonths":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(MONTH,@param1,{0})");
             //            Token.Column.ConverterParameters.AddRange(argObjects);
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddSeconds":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(SECOND,@param1,{0})");
             //            Token.Column.ConverterParameters.AddRange(argObjects);
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddYears":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(YEAR,@param1,{0})");
             //            Token.Column.ConverterParameters.AddRange(argObjects);
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    default:
             //        throw new Exception();
             //}
             //Token.Column.Converter = converter;
         }
         else if (body.Token.Type == TokenType.Object && !_isColumn)
         {
             Token = Token.Create(node.Method.Invoke(body.Token.Object, args.Select(x => x.Object).ToArray()));
         }
         else if (body.Token.Type == TokenType.Object && _isColumn)
         {
             Token = args[0];
             var parameters = new List<object>();
             parameters.Add(body.Token.Object);
             parameters.AddRange(args.Skip(1));
             Token.Column.Converters.Push(new ColumnConverter(node.Method, parameters, false));
             //string converter = Token.Column.Converter;
             //if (string.IsNullOrWhiteSpace(converter))
             //{
             //    converter = "{0}";
             //}
             //var method = node.Method;
             //switch (method.Name)
             //{
             //    case "Contains":
             //        if (method.DeclaringType == typeof(string))
             //        {
             //            converter = string.Format(converter, "CHARINDEX({0},@param1)>0");
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "StartsWith":
             //        if (method.DeclaringType == typeof(string))
             //        {
             //            converter = string.Format(converter, "CHARINDEX(@param1,{0})>0");
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddDays":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(DAY,{0},@param1)");
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddHours":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(HOUR,{0},@param1)");
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddMilliseconds":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(MILLISECOND,{0},@param1)");
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddMinutes":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(MINUTE,{0},@param1)");
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddMonths":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(MONTH,{0},@param1)");
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddSeconds":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(SECOND,{0},@param1)");
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    case "AddYears":
             //        if (method.DeclaringType == typeof(DateTime))
             //        {
             //            converter = string.Format(converter, "DATEADD(YEAR,{0},@param1)");
             //        }
             //        else
             //        {
             //            throw new Exception("不支持");
             //        }
             //        break;
             //    default:
             //        throw new Exception("不支持");
             //}
             //Token.Column.Converter = converter;
             //Token.Column.ConverterParameters.Add(body.Token.Object);
         }
         else
         {
             throw new Exception();
         }
     }
     return node;
 }