Exemplo n.º 1
0
        private static ObProperty GetProperty <T>(T m, string propertyName)
        {
            if (string.IsNullOrEmpty(propertyName))
            {
                return(null);
            }
            object model     = m;
            var    type      = typeof(T);
            var    tableName = type.ToTableName();
            var    index     = 0;
            var    pns       = propertyName.Split('.').ToList();

            while (index < pns.Count)
            {
                propertyName = pns[index];
                var property = type.GetProperties(BindingFlags.Instance | BindingFlags.Public).FirstOrDefault(obj => obj.Name == propertyName);
                if (property == null)
                {
                    return(null);
                }
                if (index + 1 < pns.Count)
                {
                    type = property.PropertyType;
                    if (typeof(ObTermBase).IsAssignableFrom(type))
                    {
                        model = property.GetValue(model);
                        if (m == null)
                        {
                            return(null);
                        }
                    }
                }
                index++;
            }
            if (model is ObTermBase obTerm)
            {
                return(obTerm.GetProperty(propertyName));
            }
            pns.Insert(0, tableName);
            pns.RemoveAt(pns.Count - 1);
            tableName = string.Join("_", pns);
            var obRedefine = ObRedefine.Create(type, tableName);

            return(ObProperty.Create(type, obRedefine, propertyName));
        }
Exemplo n.º 2
0
        private static ObProperty CreateProperty(ObProperty left, ExpressionType nodeType, object right)
        {
            switch (nodeType)
            {
            case ExpressionType.Add:
            case ExpressionType.AddChecked:
                return(left + right);

            case ExpressionType.Subtract:
            case ExpressionType.SubtractChecked:
                return(left - right);

            case ExpressionType.Divide:
                return(left / right);

            case ExpressionType.Multiply:
            case ExpressionType.MultiplyChecked:
                return(left * right);

            case ExpressionType.Modulo:
                return(left % right);

            case ExpressionType.And:
                return(left & right);

            case ExpressionType.Or:
                return(left | right);

            case ExpressionType.ExclusiveOr:
                return(left ^ right);

            case ExpressionType.LeftShift:
                return(left << Convert.ToInt32(right));

            case ExpressionType.RightShift:
                return(left >> Convert.ToInt32(right));
            }
            return(null);
        }
Exemplo n.º 3
0
        private static ObParameterBase CreateParameter(ObProperty obProperty, ExpressionType nodeType, object value, bool not)
        {
            switch (nodeType)
            {
            case ExpressionType.Equal:
                return(not? obProperty != value : obProperty == value);

            case ExpressionType.GreaterThan:
                return(not ? obProperty <= value : obProperty > value);

            case ExpressionType.GreaterThanOrEqual:
                return(not ? obProperty > value : obProperty >= value);

            case ExpressionType.LessThan:
                return(not ? obProperty >= value : obProperty < value);

            case ExpressionType.LessThanOrEqual:
                return(not ? obProperty > value : obProperty <= value);

            case ExpressionType.NotEqual:
                return(not ? obProperty == value : obProperty != value);
            }
            return(null);
        }
Exemplo n.º 4
0
        private object CreateValue(Expression exp, string path = "")
        {
            if (exp is BinaryExpression biExp)
            {
                var left  = CreateProperty(biExp.Left);
                var right = CreateValue(biExp.Right);
                return(CreateProperty(left, biExp.NodeType, right));
            }

            if (exp is NewExpression newExp)
            {
                //return arrExp.Expressions.Select(o => ((ConstantExpression)o).Value).ToArray();
                var list = new List <object>();
                for (var i = 0; i < newExp.Arguments.Count; i++)
                {
                    var a   = newExp.Arguments[i];
                    var m   = newExp.Members[i];
                    var obj = CreateValue(a, path + "." + m.Name);
                    if (obj is object[] objs)
                    {
                        list.AddRange(objs);
                    }
                    else
                    {
                        list.Add(obj);
                    }
                }
                return(list.ToArray());
            }

            if (exp is NewArrayExpression arrExp)
            {
                //return arrExp.Expressions.Select(o => ((ConstantExpression)o).Value).ToArray();
                return(arrExp.Expressions.Select(o => CreateValue(o)).ToArray());
            }

            if (exp is ConstantExpression coExp)
            {
                //常量
                return(coExp.Value);
            }

            if (exp is MemberExpression meExp)
            {
                if (meExp.Expression is ConstantExpression ||
                    meExp.Expression is MemberExpression)
                {
                    return(Expression.Lambda(meExp).Compile().DynamicInvoke());
                }
                var tableName = typeof(TModel).ToTableName(SqlBuilder.ObRedefine.Models);
                var ts        = meExp.ToString()
                                .Replace(".FirstOrDefault()", "").Replace(".First()", "")
                                .Replace(".LastOrDefault()", "").Replace(".Last()", "")
                                .Split('.').ToList();
                ts[0] = tableName;
                ts.RemoveAt(ts.Count - 1);
                var obRedefine = Factory.ObRedefine.Create(meExp.Expression.Type, string.Join("_", ts));
                return(ObProperty.Create(meExp.Expression.Type, obRedefine, meExp.Member.Name));
            }

            if (exp is MethodCallExpression mcallExp)
            {
                switch (mcallExp.Method.Name)
                {
                /*case "Contains":
                 * {
                 *  if (mcallExp.Object != null)
                 *  {
                 *      return CreateProperty(mcallExp.Object);
                 *  }
                 *  return CreateProperty(mcallExp.Arguments[1]);
                 * }*/
                case "Substring":
                {
                    var obProperty = CreateProperty(mcallExp.Object);
                    var value      = mcallExp.Arguments.Select(o => (int)((ConstantExpression)o).Value).ToArray();
                    obProperty = ObFunc.SubString(obProperty, value[0], value[1]);
                    return(obProperty);
                }

                case "Replace":
                {
                    var obProperty = CreateProperty(mcallExp.Object);
                    var value      = mcallExp.Arguments.Select(o => (string)((ConstantExpression)o).Value).ToArray();
                    obProperty = ObFunc.Replace(obProperty, value[0], value[1]);
                    return(obProperty);
                }

                case "IndexOf":
                {
                    var obProperty = CreateProperty(mcallExp.Object);
                    var value      = mcallExp.Arguments.Select(o => (string)((ConstantExpression)o).Value).ToArray();
                    obProperty = ObFunc.IndexOf(obProperty, value[0]);
                    return(obProperty);
                }

                case "ToString":
                {
                    var obProperty = CreateProperty(mcallExp.Object);
                    obProperty = mcallExp.Arguments.Count > 0
                            ? ObFunc.ToString(obProperty, CreateValue(mcallExp.Arguments[0]).ToString())
                            : ObFunc.ToString(obProperty);
                    return(obProperty);
                }

                case "ToInt16":
                {
                    var obProperty = CreateProperty(mcallExp.Arguments[0]);
                    obProperty = ObFunc.ToInt16(obProperty);
                    return(obProperty);
                }

                case "ToInt32":
                {
                    var obProperty = CreateProperty(mcallExp.Arguments[0]);
                    obProperty = ObFunc.ToInt32(obProperty);
                    return(obProperty);
                }

                case "ToInt64":
                {
                    var obProperty = CreateProperty(mcallExp.Arguments[0]);
                    obProperty = ObFunc.ToInt64(obProperty);
                    return(obProperty);
                }

                case "ToSingle":
                {
                    var obProperty = CreateProperty(mcallExp.Arguments[0]);
                    obProperty = ObFunc.ToSingle(obProperty);
                    return(obProperty);
                }

                case "ToDouble":
                {
                    var obProperty = CreateProperty(mcallExp.Arguments[0]);
                    obProperty = ObFunc.ToDouble(obProperty);
                    return(obProperty);
                }

                /*case "ToDecimal":
                 * {
                 *  var obProperty = CreateProperty(mcallExp.Arguments[0]);
                 *  obProperty = ObFunc.ToDecimal(obProperty);
                 *  return obProperty;
                 * }*/
                case "ToDateTime":
                {
                    var obProperty = CreateProperty(mcallExp.Arguments[0]);
                    obProperty = ObFunc.ToDateTime(obProperty);
                    return(obProperty);
                }

                /*case "Format":
                 * {
                 *  var obProperty = CreateProperty(mcallExp.Arguments[1]);
                 *  obProperty = ObFunc.ToString(obProperty, mcallExp.Arguments[0].ToString());
                 *  return obProperty;
                 * }*/
                case "Average":
                {
                    var obProperty = CreateProperty(((LambdaExpression)mcallExp.Arguments[1]).Body);
                    obProperty = ObFunc.Avg(obProperty);
                    return(obProperty);
                }

                case "Count":
                {
                    var type       = typeof(TModel);
                    var tableName  = type.ToTableName(SqlBuilder.ObRedefine.Models);
                    var ts         = (tableName + path).Split('.').ToList();
                    var memberName = ts[ts.Count - 1];
                    ts.RemoveAt(ts.Count - 1);
                    foreach (var t in ts)
                    {
                        foreach (var propertyInfo in type.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                        {
                            if (propertyInfo.Name != t)
                            {
                                continue;
                            }
                            type = propertyInfo.PropertyType;
                            break;
                        }
                    }
                    var obRedefine = Factory.ObRedefine.Create(type, string.Join("_", ts));
                    var obProperty = ObProperty.Create(type, obRedefine, memberName);
                    obProperty = ObFunc.Count(obProperty);
                    return(obProperty);
                }

                case "Max":
                {
                    var obProperty = CreateProperty(((LambdaExpression)mcallExp.Arguments[1]).Body);
                    obProperty = ObFunc.Max(obProperty);
                    return(obProperty);
                }

                case "Min":
                {
                    var obProperty = CreateProperty(((LambdaExpression)mcallExp.Arguments[1]).Body);
                    obProperty = ObFunc.Min(obProperty);
                    return(obProperty);
                }

                case "Sum":
                {
                    var obProperty = CreateProperty(((LambdaExpression)mcallExp.Arguments[1]).Body);
                    obProperty = ObFunc.Sum(obProperty);
                    return(obProperty);
                }
                }
            }

            if (exp is UnaryExpression unExp)
            {
                var obProperty = CreateProperty(unExp.Operand);
                switch (unExp.NodeType)
                {
                case ExpressionType.Convert:
                    if (unExp.Type == typeof(string))
                    {
                        obProperty = ObFunc.ToString(obProperty);
                    }
                    if (unExp.Type == typeof(short))
                    {
                        obProperty = ObFunc.ToInt16(obProperty);
                    }
                    if (unExp.Type == typeof(int))
                    {
                        obProperty = ObFunc.ToInt32(obProperty);
                    }
                    if (unExp.Type == typeof(long))
                    {
                        obProperty = ObFunc.ToInt64(obProperty);
                    }
                    if (unExp.Type == typeof(float))
                    {
                        obProperty = ObFunc.ToSingle(obProperty);
                    }
                    if (unExp.Type == typeof(double))
                    {
                        obProperty = ObFunc.ToDouble(obProperty);
                    }
                    if (unExp.Type == typeof(DateTime))
                    {
                        obProperty = ObFunc.ToDateTime(obProperty);
                    }
                    return(obProperty);

                case ExpressionType.Not:
                    obProperty = ~obProperty;
                    return(obProperty);

                case ExpressionType.Negate:
                    obProperty = -obProperty;
                    return(obProperty);
                }
            }
            return(null);
        }
Exemplo n.º 5
0
 public virtual IObGroup AddGroupBy(ObProperty obProperty)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 6
0
 public virtual IObSort AddOrderByDescending(ObProperty obProperty)
 {
     throw new NotImplementedException();
 }