/// <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 += ")");
        }