/// <summary> /// 从mapping 中寻找指定的属性名 如果找不到 返回属性名 /// </summary> /// <param name="sqlFieldMapping"></param> /// <param name="propName"></param> /// <returns></returns> internal static string SearchPropertyMappingField(SqlFieldMapping sqlFieldMapping, string propName) { if (null == sqlFieldMapping) { return(propName); } var field = sqlFieldMapping.Filelds.FirstOrDefault(x => x.PropertyName == propName); if (null == field) { return(propName); } return(field.FieldColumnName); }
/// <summary> /// 解析Lambda 到Where条件表达式 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="func"></param> /// <param name="sqlFieldMapping"></param> /// <param name="wrapperChar">字段的包裹符号</param> /// <returns></returns> internal static string ConvertLambdaToCondition <T>(Expression <Func <T, bool> > func, SqlFieldMapping sqlFieldMapping, string wrapperChar = "") where T : BaseEntity { var whereStr = string.Empty; if (func.Body is BinaryExpression) { BinaryExpression be = ((BinaryExpression)func.Body); Expression originalLeft = be.Left; Expression originalRight = be.Right; Expression afterProcessLeft = ProcessNoneValueBoolenExpression <T>(originalLeft); Expression afterProcessRight = ProcessNoneValueBoolenExpression <T>(originalRight); whereStr = BinarExpressionProvider(afterProcessLeft, afterProcessRight, be.NodeType, sqlFieldMapping, wrapperChar); //whereStr = BinarExpressionProvider(be.Left, be.Right, be.NodeType); } if (func.Body is MethodCallExpression) { MethodCallExpression mce = ((MethodCallExpression)func.Body); string methodCondition = ExpressionRouter(mce, sqlFieldMapping); if (!string.IsNullOrEmpty(methodCondition)) { if (whereStr != string.Empty) { whereStr += " and "; whereStr += methodCondition; } else { whereStr = methodCondition; } } } return(whereStr); }
static string ExpressionRouter(Expression exp, SqlFieldMapping sqlFieldMapping, string wrapperChar = "") { string sb = string.Empty; if (exp is BinaryExpression) { BinaryExpression be = ((BinaryExpression)exp); return(BinarExpressionProvider(be.Left, be.Right, be.NodeType, sqlFieldMapping, wrapperChar)); } else if (exp is MemberExpression) { if (!exp.ToString().StartsWith("value(")) { MemberExpression me = ((MemberExpression)exp); string filedName = SearchPropertyMappingField(sqlFieldMapping, me.Member.Name); return(string.Concat(wrapperChar, filedName, wrapperChar)); } else { ConstantExpression conExpression = null; TryEvaluatePath(exp, out conExpression); var result = conExpression.Value; if (result == null) { return("null"); } if (result is ValueType && !(result is Guid) && !(result is DateTime)) //guid 虽然是值类型的 --长整型,datetime 是struct 也是继承值类型 但是在SQL操作的时候 是按照字符串处理的 { if (result is Enum) { return(((int)result).ToString()); //枚举类型的 要转换为具体的int 值 } return(result.ToString()); } else if (result is string || result is DateTime || result is char || result is Guid) { if (result is DateTime) { //将时间进行统一 yyyy-MM-dd HH:mm:ss return(string.Format("'{0}'", ((DateTime)result).ToOfenTimeString())); } return(string.Format("'{0}'", result.ToString())); } } } else if (exp is NewArrayExpression) { NewArrayExpression ae = ((NewArrayExpression)exp); StringBuilder tmpstr = new StringBuilder(); foreach (Expression ex in ae.Expressions) { tmpstr.Append(ExpressionRouter(ex, null)); tmpstr.Append(","); } return(tmpstr.ToString(0, tmpstr.Length - 1)); } else if (exp is MethodCallExpression) { MethodCallExpression mce = (MethodCallExpression)exp; if (mce.Method.Name == "Like") { return(string.Format("({2}{0}{2} like {1})", ExpressionRouter(mce.Arguments[0], sqlFieldMapping), ExpressionRouter(mce.Arguments[1], null), wrapperChar)); } else if (mce.Method.Name == "Contains") { return(string.Format("({2}{0}{2} like {1})", ExpressionRouter(mce.Object, sqlFieldMapping), ExpressionRouter(mce.Arguments[0], null), wrapperChar)); } else if (mce.Method.Name == "NotLike") { return(string.Format("({2}{0}{2} Not like {1})", ExpressionRouter(mce.Arguments[0], sqlFieldMapping), ExpressionRouter(mce.Arguments[1], null), wrapperChar)); } else if (mce.Method.Name == "In") { return(string.Format("{{2}{0}{2} In ({1})", ExpressionRouter(mce.Arguments[0], sqlFieldMapping), ExpressionRouter(mce.Arguments[1], null), wrapperChar)); } else if (mce.Method.Name == "NotIn") { return(string.Format("{2}{0}{2} Not In ({1})", ExpressionRouter(mce.Arguments[0], sqlFieldMapping), ExpressionRouter(mce.Arguments[1], null), wrapperChar)); } else if (mce.Method.Name == "LenFuncInSql") { return(string.Format("len({1}{0}{1})", ExpressionRouter(mce.Arguments[0], sqlFieldMapping), wrapperChar)); } else { //实例方法或者静态方法的调用解析 if (null != mce.Object) { //如果不是自定义的内置sql函数方法 活着扩展, 那么只取属性;例如 x.Id.ToString() .那么仅仅返回id属性即可 var mceValue = ExpressionRouter(mce.Object, sqlFieldMapping); if (null != mceValue) { return(mceValue); //string.Format("{1}{0}{1}", mceValue, wrapperChar); } else { //解析不是基础类型 时候 尝试执行表达式 object result = Expression.Lambda(mce).Compile().DynamicInvoke(); ConstantExpression consExpress = Expression.Constant(result); return(ExpressionRouter(consExpress, sqlFieldMapping)); } } else { //如果是System 处理函数 调用 那么执行函数调用的结果 object result = Expression.Lambda(mce).Compile().DynamicInvoke(); ConstantExpression consExpress = Expression.Constant(result); return(ExpressionRouter(consExpress, sqlFieldMapping)); } } } else if (exp is ConstantExpression) { ConstantExpression ce = ((ConstantExpression)exp); if (ce.Value == null) { return("null"); } else if (ce.Value is ValueType) { if (ce.Value is Guid || ce.Value is DateTime) //处理guid值 { return(string.Format("'{0}'", ce.Value.ToString())); } return(ce.Value.ToString());//处理bool值 ce.Value is bool } else if (ce.Value is string || ce.Value is DateTime || ce.Value is char) { return(string.Format("'{0}'", ce.Value.ToString())); } } else if (exp is UnaryExpression) { UnaryExpression ue = ((UnaryExpression)exp); return(ExpressionRouter(ue.Operand, sqlFieldMapping)); } return(null); }
static string BinarExpressionProvider(Expression left, Expression right, ExpressionType type, SqlFieldMapping sqlFieldMapping, string wrapperChar = "") { string sb = "("; //先处理左边 sb += ExpressionRouter(left, sqlFieldMapping, wrapperChar);//左边的字段 传递包裹符号 sb += ExpressionTypeCast(type); //再处理右边 string tmpStr = ExpressionRouter(right, sqlFieldMapping, wrapperChar);//左边的字段 传递包裹符号 if (tmpStr == "null") { if (sb.EndsWith(" =")) { sb = sb.Substring(0, sb.Length - 2) + " is null"; } else if (sb.EndsWith("<>")) { sb = sb.Substring(0, sb.Length - 2) + " is not null"; } } else { sb += tmpStr; } return(sb += ")"); }