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)); }
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); }
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); }
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); }
public virtual IObGroup AddGroupBy(ObProperty obProperty) { throw new NotImplementedException(); }
public virtual IObSort AddOrderByDescending(ObProperty obProperty) { throw new NotImplementedException(); }