예제 #1
0
 object GetParameExpressionValue(Expression expression)
 {
     //只能处理常量
     if (expression is ConstantExpression)
     {
         ConstantExpression cExp = (ConstantExpression)expression;
         return(cExp.Value);
     }
     else if (expression is MemberExpression)//按属性访问
     {
         var m = expression as MemberExpression;
         if (m.Expression != null)
         {
             if (m.Expression.NodeType == ExpressionType.Parameter)
             {
                 string name   = m.Member.Name;
                 var    filed2 = TypeCache.GetProperties(m.Expression.Type, true)[name];
                 return(new ExpressionValueObj {
                     Value = FormatFieldPrefix(m.Expression.Type, filed2.MapingName), IsMember = true
                 });
             }
             else
             {
                 var v = ConstantValueVisitor.GetMemberExpressionValue(m);
                 return(v);
             }
         }
     }
     //按编译
     return(Expression.Lambda(expression).Compile().DynamicInvoke());
 }
예제 #2
0
 object GetParameExpressionValue(Expression expression, out bool isConstant)
 {
     isConstant = false;
     //只能处理常量
     if (expression is ConstantExpression)
     {
         isConstant = true;
         ConstantExpression cExp = (ConstantExpression)expression;
         return(cExp.Value);
     }
     else if (expression is MemberExpression)//按属性访问
     {
         var m = expression as MemberExpression;
         if (m.Expression != null)
         {
             if (m.Expression.NodeType == ExpressionType.Parameter)
             {
                 string name   = m.Member.Name;
                 var    filed2 = TypeCache.GetProperties(m.Expression.Type, true)[name];
                 return(new ExpressionValueObj {
                     Value = FormatFieldPrefix(m.Expression.Type, __DBAdapter.FieldNameFormat(filed2)), IsMember = true, member = m.Member
                 });
             }
             else
             {
                 return(ConstantValueVisitor.GetMemberExpressionValue(m, out isConstant));
             }
         }
         return(ConstantValueVisitor.GetMemberExpressionValue(m, out isConstant));
     }
     //按编译
     return(Expression.Lambda(expression).Compile().DynamicInvoke());
 }
예제 #3
0
        internal SelectFieldInfo GetSelectField(bool isSelect, Expression expressionBody, bool withTablePrefix, params Type[] types)
        {
            SelectFieldInfo item;

            if (isSelect)
            {
                var cacheKey = GetSelectFieldCacheKey(isSelect, expressionBody, withTablePrefix, types);
                var cache    = !string.IsNullOrEmpty(cacheKey);
                //cache = false;
                if (cache)
                {
                    #region cache
                    var a = _GetSelectFieldCache.TryGetValue(cacheKey, out item);
                    if (a)
                    {
                        if (expressionBody is NewExpression)
                        {
                            var newExp = expressionBody as NewExpression;
                            foreach (var kv in item.parame)
                            {
                                var exp = newExp.Arguments[Convert.ToInt32(kv.Value)];
                                if (exp is MethodCallExpression)
                                {
                                    var mExp = exp as MethodCallExpression;
                                    if (mExp.Arguments.Count > 0)
                                    {
                                        string mName;
                                        getSelectMethodCall(exp, out mName, 0, false);//转换为参数
                                    }
                                }
                                else
                                {
                                    var obj = ConstantValueVisitor.GetParameExpressionValue(exp);
                                    __Visitor.AddParame(kv.Key, obj);
                                }
                            }
                        }
                        return(item);
                    }
                    else
                    {
                        item = _GetSelectField(isSelect, expressionBody, withTablePrefix, types);
                        //item.expression = expressionBody;
                        _GetSelectFieldCache[cacheKey] = item;
                        return(item);
                    }
                    #endregion
                }
            }
            item = _GetSelectField(isSelect, expressionBody, withTablePrefix, types);
            return(item);
        }
예제 #4
0
        /// <summary>
        /// 解析选择的字段
        /// </summary>
        /// <param name="isSelect">查询字段时按属性名生成别名</param>
        /// <param name="expressionBody"></param>
        /// <param name="withTablePrefix">是否生按表生成前辍,关联时用 如Table__Name</param>
        /// <param name="types"></param>
        /// <returns></returns>
        internal SelectFieldInfo GetSelectField(bool isSelect, Expression expressionBody, bool withTablePrefix, params Type[] types)
        {
            var allFields = new Dictionary <Type, IgnoreCaseDictionary <Attribute.FieldAttribute> >();

            allFields.Add(__MainType, TypeCache.GetProperties(__MainType, true));
            foreach (var t in types)
            {
                if (!allFields.ContainsKey(t))
                {
                    allFields.Add(t, TypeCache.GetProperties(t, true));
                }
            }

            if (expressionBody is ParameterExpression)//选择所有字段
            {
                var resultFields = new List <Attribute.FieldMapping>();
                foreach (var item in allFields[expressionBody.Type].Values)
                {
                    var item2 = item.GetFieldMapping(__DBAdapter, GetPrefix(item.ModelType), false, "");
                    resultFields.Add(item2);
                }
                var selectFieldItem = new SelectFieldInfo(resultFields);
                return(selectFieldItem);
            }
            else if (expressionBody is NewExpression)//按匿名对象
            {
                var resultFields = new List <Attribute.FieldMapping>();
                #region  匿名对象

                var newExpression = expressionBody as NewExpression;
                for (int i = 0; i < newExpression.Arguments.Count(); i++)
                {
                    var item       = newExpression.Arguments[i];
                    var memberName = newExpression.Members[i].Name;
                    if (item is MethodCallExpression)//group用
                    {
                        var    methodCallExpression = item as MethodCallExpression;
                        string methodMember;
                        var    methodQuery = getSelectMethodCall(methodCallExpression, out methodMember, i);
                        var    f           = new Attribute.FieldAttribute()
                        {
                            ModelType = __MainType, MemberName = memberName, PropertyType = item.Type
                        };
                        var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, methodQuery);
                        f2.MethodName = methodCallExpression.Method.Name;
                        resultFields.Add(f2);
                    }
                    else if (item is BinaryExpression)
                    {
                        var field = getSeletctBinary(item);
                        var f     = new Attribute.FieldAttribute()
                        {
                            ModelType = __MainType, MemberName = "", PropertyType = item.Type
                        };
                        var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, field);
                        resultFields.Add(f2);
                    }
                    else if (item is ConstantExpression)//常量
                    {
                        var constantExpression = item as ConstantExpression;
                        var f = new Attribute.FieldAttribute()
                        {
                            ModelType = __MainType, MemberName = "", PropertyType = item.Type
                        };
                        var value = constantExpression.Value + "";
                        if (!value.IsNumber())
                        {
                            value = string.Format("'{0}'", value);
                        }
                        var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, value);
                        //f.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = value, MethodName = "" };
                        resultFields.Add(f2);
                    }
                    else if (item is MemberExpression)
                    {
                        var memberExpression = item as MemberExpression;//转换为属性访问表达式
                        if (memberExpression.Expression.NodeType == ExpressionType.Constant)
                        {
                            string parName = __DBAdapter.GetParamName("p", i);
                            //newExpressionParame.Add(parName, i);
                            var obj = ConstantValueVisitor.GetParameExpressionValue(item);
                            var f2  = new Attribute.FieldAttribute()
                            {
                                ModelType = __MainType, PropertyType = item.Type
                            };
                            var f3 = f2.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, parName);
                            //f2.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = parName, MethodName = "" };
                            resultFields.Add(f3);
                            __Visitor.AddParame(parName, obj);
                            continue;
                        }
                        else if (memberExpression.Member.ReflectedType.Name.StartsWith("<>f__AnonymousType"))
                        {
                            //按匿名对象属性,视图关联时用
                            var f2 = new Attribute.FieldAttribute()
                            {
                                MemberName = memberExpression.Member.Name, PropertyType = item.Type
                            };
                            var f3 = f2.GetFieldMapping(__DBAdapter, GetPrefix(memberExpression.Expression.Type), withTablePrefix, memberName);
                            resultFields.Add(f3);
                            continue;
                        }
                        //按属性
                        Attribute.FieldAttribute f;
                        var a2 = allFields[memberExpression.Expression.Type].TryGetValue(memberExpression.Member.Name, out f);
                        if (!a2)
                        {
                            throw new CRLException("找不到可筛选的属性" + memberExpression.Member.Name + " 在" + memberExpression.Expression.Type);
                        }
                        Attribute.FieldMapping _f2;
                        if (memberName != memberExpression.Member.Name)//按有别名算
                        {
                            _f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, memberName);
                        }
                        else
                        {
                            //字段名和属性名不一样时才生成别名
                            //todo 属性别名不一样时,查询应返回属性名
                            string fieldName = "";
                            if (isSelect)//查询字段时按属性名生成别名
                            {
                                if (!string.IsNullOrEmpty(f.MapingName))
                                {
                                    fieldName = f.MemberName;
                                }
                            }
                            _f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, fieldName);
                        }
                        //f.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = f.MapingName, MethodName = "" };
                        resultFields.Add(_f2);
                    }
                    else
                    {
                        throw new CRLException("不支持此语法解析:" + item);
                    }
                }
                #endregion
                var selectFieldItem = new SelectFieldInfo(resultFields);
                return(selectFieldItem);
            }
            else if (expressionBody is MethodCallExpression)
            {
                #region 方法
                var method = expressionBody as MethodCallExpression;
                var f      = new Attribute.FieldAttribute()
                {
                    ModelType = __MainType, MemberName = "", PropertyType = expressionBody.Type
                };
                string methodMember;
                var    methodQuery = getSelectMethodCall(expressionBody, out methodMember, 0);
                var    f2          = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, "", methodQuery);
                f2.MethodName = method.Method.Name;
                #endregion
                var selectFieldItem = new SelectFieldInfo(f2);
                return(selectFieldItem);
            }
            else if (expressionBody is BinaryExpression)
            {
                var field = getSeletctBinary(expressionBody);
                var f     = new Attribute.FieldAttribute()
                {
                    ModelType = __MainType, MemberName = "", PropertyType = expressionBody.Type
                };
                var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, "", field);
                var selectFieldItem = new SelectFieldInfo(f2);
                return(selectFieldItem);
            }
            else if (expressionBody is ConstantExpression)
            {
                var constant = (ConstantExpression)expressionBody;
                var f        = new Attribute.FieldAttribute()
                {
                    ModelType = __MainType, MemberName = "", PropertyType = expressionBody.Type
                };
                var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, "", constant.Value + "");
                var selectFieldItem = new SelectFieldInfo(f2);
                return(selectFieldItem);
            }
            else if (expressionBody is UnaryExpression)
            {
                var unaryExpression = expressionBody as UnaryExpression;
                return(GetSelectField(false, unaryExpression.Operand, withTablePrefix, types));
            }
            else if (expressionBody is MemberExpression)//按成员
            {
                #region MemberExpression
                var mExp = (MemberExpression)expressionBody;
                if (mExp.Expression.Type.BaseType == typeof(object))
                {
                    //按匿名对象属性,视图关联时用
                    var _f = new Attribute.FieldAttribute()
                    {
                        MemberName = mExp.Member.Name, PropertyType = mExp.Type
                    };
                    var f3 = _f.GetFieldMapping(__DBAdapter, GetPrefix(mExp.Expression.Type), withTablePrefix, mExp.Member.Name);
                    return(new SelectFieldInfo(f3));
                }
                CRL.Attribute.FieldAttribute f;
                var a = allFields[mExp.Expression.Type].TryGetValue(mExp.Member.Name, out f);
                if (!a)
                {
                    throw new CRLException("找不到可筛选的属性" + mExp.Member.Name + " 在" + mExp.Expression.Type);
                }
                var f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, "");
                return(new SelectFieldInfo(f2));

                #endregion
            }
            else
            {
                throw new CRLException("不支持此语法解析:" + expressionBody);
            }
        }
예제 #5
0
        CRLExpression.CRLExpression MethodCallExpressionHandler(Expression exp, ExpressionType?nodeType = null, bool firstLevel = false)
        {
            #region methodCall
            MethodCallExpression mcExp = (MethodCallExpression)exp;
            var        arguments       = new List <object>();
            var        allArguments    = new List <Expression>(mcExp.Arguments);
            int        argsIndex       = 0;
            Expression firstArgs;
            bool       isLambdaQueryJoinExt = false;
            if (mcExp.Object == null)        //区分静态方法还是实例方法
            {
                firstArgs = allArguments[0]; //like b.Name.IsNull("22")
                argsIndex = 1;
                if (firstArgs.Type.Name.Contains("LambdaQueryJoin"))
                {
                    isLambdaQueryJoinExt = true;
                }
            }
            else
            {
                firstArgs = mcExp.Object;                                            //like b.Id.ToString()
                if (allArguments.Count > 0 && (allArguments[0] is MemberExpression)) //like ids.Contains(b.Id)
                {
                    var mexp2      = allArguments[0] as MemberExpression;
                    var firstArgsM = firstArgs as MemberExpression;
                    //var par2 = (ParameterExpression)mexp2.Expression;
                    if (mexp2.Expression is ParameterExpression && firstArgsM.Expression is ConstantExpression)
                    {
                        firstArgs = allArguments[0];
                        argsIndex = 1;
                        allArguments.Add(mcExp.Object);
                        if (firstArgs.Type.Name.Contains("LambdaQueryJoin"))
                        {
                            isLambdaQueryJoinExt = true;
                        }
                    }
                }
            }
            #region MethodCallExpression
            //bool isConstantMethod = false;

            MemberExpression memberExpression;

            string methodField = "";
            string memberName  = "";
            string methodName  = mcExp.Method.Name;

            if (firstArgs is ParameterExpression || isLambdaQueryJoinExt)
            {
                var exp2 = mcExp.Arguments[1] as UnaryExpression;
                var type = exp2.Operand.GetType();
                var p    = type.GetProperty("Body");
                var exp3 = p.GetValue(exp2.Operand, null) as Expression;
                methodField = RouteExpressionHandler(exp3).SqlOut;
                memberName  = "";
            }
            else if (firstArgs is UnaryExpression)//like a.Code.Count()
            {
                memberExpression = (firstArgs as UnaryExpression).Operand as MemberExpression;
                memberName       = memberExpression.Member.Name;
                var field = TypeCache.GetProperties(memberExpression.Expression.Type, true)[memberName];
                memberName  = __DBAdapter.FieldNameFormat(field);
                methodField = FormatFieldPrefix(memberExpression.Expression.Type, memberName);
            }
            else if (firstArgs is BinaryExpression)
            {
                var be = firstArgs as BinaryExpression;
                methodField = BinaryExpressionHandler(be.Left, be.Right, be.NodeType).Data.ToString();
            }
            else if (firstArgs is MemberExpression)
            {
                //like a.Code
                memberExpression = firstArgs as MemberExpression;
                memberName       = memberExpression.Member.Name;
                var type = memberExpression.Expression.Type;
                if (type.IsSubclassOf(typeof(IModel)))
                {
                    var field = TypeCache.GetProperties(type, true)[memberExpression.Member.Name];
                    memberName = __DBAdapter.FieldNameFormat(field);
                }
                if (memberExpression.Expression.NodeType == ExpressionType.Parameter)
                {
                    methodField = FormatFieldPrefix(memberExpression.Expression.Type, memberName);
                    //var allConstant = true;
                    for (int i = argsIndex; i < allArguments.Count; i++)
                    {
                        bool isConstant2;
                        var  obj = GetParameExpressionValue(allArguments[i], out isConstant2);
                        arguments.Add(obj);
                    }
                }
                else
                {
                    //like Convert.ToDateTime(times)
                    var obj = ConstantValueVisitor.GetParameExpressionValue(firstArgs);
                    arguments.Add(obj);
                    for (int i = argsIndex; i < allArguments.Count; i++)
                    {
                        bool isConstant2;
                        var  obj2 = GetParameExpressionValue(allArguments[i], out isConstant2);
                        arguments.Add(obj2);
                    }
                }
            }
            else if (firstArgs is ConstantExpression)//按常量
            {
                //like DateTime.Parse("2016-02-11 12:56"),
                //isConstantMethod = true;
                var obj = ConstantValueVisitor.GetParameExpressionValue(firstArgs);
                arguments.Add(obj);
            }
            //else
            //{
            //    throw new CRLException("不支持此语法解析:" + args);
            //}

            if (nodeType == null)
            {
                nodeType = ExpressionType.Equal;
            }
            if (string.IsNullOrEmpty(methodField))
            {
                //当是常量转换方法

                var    method = mcExp.Method;
                object obj    = null;
                if (method.IsStatic)            //like DateTime.Parse("2016-02-11")
                {
                    if (method.IsGenericMethod) //扩展方法,like public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value)
                    {
                        var valueObj = (ExpressionValueObj)arguments[1];
                        if (valueObj == null)
                        {
                            throw new Exception("不支持此语法:" + mcExp);
                        }
                        memberName = valueObj.member.Name;
                        arguments  = new List <object>()
                        {
                            arguments[0]
                        };
                        methodField = valueObj.Value.ToString();
                        goto lable1;
                    }
                    else
                    {
                        obj = method.Invoke(null, arguments.ToArray());
                    }
                }
                else//like time.AddDays(1)
                {
                    if (arguments.Count == 0)
                    {
                        throw new Exception("未能解析" + exp);
                    }
                    var args1 = arguments.First();
                    arguments.RemoveAt(0);
                    if (arguments.Count > 0)
                    {
                        if (arguments[0] is ExpressionValueObj)
                        {
                            throw new Exception("不支持这样的语法:" + exp);
                        }
                    }
                    obj = method.Invoke(args1, arguments.ToArray());
                }
                var exp2 = new CRLExpression.CRLExpression()
                {
                    Type = CRLExpression.CRLExpressionType.Value, Data = obj
                };

                return(exp2);
            }

lable1:
            var methodInfo = new CRLExpression.MethodCallObj()
            {
                Args = arguments, ExpressionType = nodeType.Value, MemberName = memberName, MethodName = methodName, MemberQueryName = methodField
            };
            methodInfo.ReturnType = mcExp.Type;

            #endregion
            var exp4 = new CRLExpression.CRLExpression()
            {
                Type = CRLExpression.CRLExpressionType.MethodCall, Data = methodInfo
            };

            return(exp4);

            #endregion
        }
예제 #6
0
        SelectFieldInfo GetNewExpressionMember(bool isSelect, Dictionary <Type, IgnoreCaseDictionary <Attribute.FieldInnerAttribute> > allFields, bool withTablePrefix, List <MemberBindingObj> members)
        {
            var resultFields = new List <Attribute.FieldMapping>();
            var i            = -1;

            foreach (var args in members)
            {
                i += 1;
                var item       = args.Expression;
                var memberName = args.Member.Name;
label1:
                if (item is MethodCallExpression)//group用
                {
                    var    methodCallExpression = item as MethodCallExpression;
                    string methodMember;
                    var    methodQuery = getSelectMethodCall(methodCallExpression, out methodMember, i);
                    var    f           = new Attribute.FieldInnerAttribute()
                    {
                        ModelType = __MainType, MemberName = memberName, PropertyType = item.Type
                    };
                    var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, methodQuery);
                    f2.MethodName = methodCallExpression.Method.Name;
                    resultFields.Add(f2);
                }
                else if (item is BinaryExpression)
                {
                    var field = getSeletctBinary(item);
                    var f     = new Attribute.FieldInnerAttribute()
                    {
                        ModelType = __MainType, MemberName = "", PropertyType = item.Type
                    };
                    var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, field);
                    resultFields.Add(f2);
                }
                else if (item is ConstantExpression)//常量
                {
                    var constantExpression = item as ConstantExpression;
                    var f = new Attribute.FieldInnerAttribute()
                    {
                        ModelType = __MainType, MemberName = "", PropertyType = item.Type
                    };
                    var value = constantExpression.Value + "";
                    if (!StringHelper.IsDouble(value))
                    {
                        value = string.Format("'{0}'", value);
                    }
                    var f2 = f.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, value);
                    //f.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = value, MethodName = "" };
                    resultFields.Add(f2);
                }
                else if (item is MemberExpression)
                {
                    var memberExpression = item as MemberExpression;//转换为属性访问表达式
                    if (memberExpression.Expression.NodeType == ExpressionType.Constant)
                    {
                        string parName = __DBAdapter.GetParamName("p", i);
                        //newExpressionParame.Add(parName, i);
                        var obj = ConstantValueVisitor.GetParameExpressionValue(item);
                        var f2  = new Attribute.FieldInnerAttribute()
                        {
                            ModelType = __MainType, PropertyType = item.Type
                        };
                        var f3 = f2.GetFieldMapping(__DBAdapter, "", withTablePrefix, memberName, parName);
                        //f2.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = parName, MethodName = "" };
                        resultFields.Add(f3);
                        __Visitor.AddParame(parName, obj);
                        continue;
                    }
                    else if (memberExpression.Member.ReflectedType.Name.StartsWith("<>f__AnonymousType"))
                    {
                        //按匿名对象属性,视图关联时用
                        var f2 = new Attribute.FieldInnerAttribute()
                        {
                            MemberName = memberExpression.Member.Name, PropertyType = item.Type
                        };
                        var f3 = f2.GetFieldMapping(__DBAdapter, GetPrefix(memberExpression.Expression.Type), withTablePrefix, memberName);
                        resultFields.Add(f3);
                        continue;
                    }
                    //按属性
                    Attribute.FieldInnerAttribute f;
                    var a2 = allFields[memberExpression.Expression.Type].TryGetValue(memberExpression.Member.Name, out f);
                    if (!a2)
                    {
                        throw new CRLException("找不到可筛选的属性" + memberExpression.Member.Name + " 在" + memberExpression.Expression.Type);
                    }
                    Attribute.FieldMapping _f2;
                    if (memberName != memberExpression.Member.Name)//按有别名算
                    {
                        _f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, memberName);
                    }
                    else
                    {
                        //字段名和属性名不一样时才生成别名
                        //todo 属性别名不一样时,查询应返回属性名
                        string fieldName = "";
                        if (isSelect)//查询字段时按属性名生成别名
                        {
                            if (!string.IsNullOrEmpty(f.MapingName))
                            {
                                fieldName = f.MemberName;
                            }
                        }
                        _f2 = f.GetFieldMapping(__DBAdapter, GetPrefix(f.ModelType), withTablePrefix, fieldName);
                    }
                    //f.FieldQuery = new Attribute.FieldQuery() { MemberName = memberName, FieldName = f.MapingName, MethodName = "" };
                    resultFields.Add(_f2);
                }
                else if (item is UnaryExpression)
                {
                    var unaryExpression = item as UnaryExpression;
                    item = unaryExpression.Operand;
                    goto label1;
                }
                else
                {
                    throw new CRLException("不支持此语法解析:" + item);
                }
            }
            var selectFieldItem = new SelectFieldInfo(resultFields);

            return(selectFieldItem);
        }
예제 #7
0
        CRLExpression.CRLExpression MethodCallExpressionHandler(Expression exp, ExpressionType?nodeType = null, bool firstLevel = false)
        {
            #region methodCall
            MethodCallExpression mcExp = (MethodCallExpression)exp;
            var        arguments       = new List <object>();
            var        allArguments    = mcExp.Arguments;
            int        argsIndex       = 0;
            Expression firstArgs;
            bool       isLambdaQueryJoinExt = false;
            if (mcExp.Method.IsStatic)       //区分静态方法还是实例方法
            {
                firstArgs = allArguments[0]; //like b.Name.IsNull("22")
                argsIndex = 1;
                if (firstArgs.Type.Name.Contains("LambdaQueryJoin"))
                {
                    isLambdaQueryJoinExt = true;
                }
            }
            else
            {
                firstArgs = mcExp.Object;//like b.Id.ToString()
            }

            #region 缓存处理 效率并不高
            //MethodCallExpressionCacheItem methodCache;
            //string key = "";
            //if (SettingConfig.UseLambdaCache&& false)
            //{
            //    key = __PrefixsAllKey + mcExp + nodeType;
            //    var exists = MethodCallExpressionCache.TryGetValue(key, out methodCache);
            //    if (exists)
            //    {
            //        if (!methodCache.isConstantMethod)
            //        {
            //            var methodCall = methodCache.CRLExpression.Data as CRLExpression.MethodCallObj;
            //            if (methodCall.Args.Count > 0)
            //            {
            //                for (int i = argsIndex; i < allArguments.Count; i++)
            //                {
            //                    bool isConstant1;
            //                    var obj = GetParameExpressionValue(allArguments[i], out isConstant1);
            //                    arguments.Add(obj);
            //                }
            //                methodCall.Args = arguments;
            //            }
            //        }
            //        methodCache.CRLExpression.SqlOut = "";
            //        return methodCache.CRLExpression;
            //    }
            //}
            #endregion
            #region MethodCallExpression
            //bool isConstantMethod = false;

            MemberExpression memberExpression;

            string methodField = "";
            string memberName  = "";
            string methodName  = mcExp.Method.Name;

            if (firstArgs is ParameterExpression || isLambdaQueryJoinExt)
            {
                var exp2 = mcExp.Arguments[1] as UnaryExpression;
                var type = exp2.Operand.GetType();
                var p    = type.GetProperty("Body");
                var exp3 = p.GetValue(exp2.Operand, null) as Expression;
                methodField = RouteExpressionHandler(exp3).SqlOut;
                memberName  = "";
            }
            else if (firstArgs is UnaryExpression)//like a.Code.Count()
            {
                memberExpression = (firstArgs as UnaryExpression).Operand as MemberExpression;
                memberName       = memberExpression.Member.Name;
                var field = TypeCache.GetProperties(memberExpression.Expression.Type, true)[memberName];
                memberName  = __DBAdapter.FieldNameFormat(field);
                methodField = FormatFieldPrefix(memberExpression.Expression.Type, memberName);
            }
            else if (firstArgs is BinaryExpression)
            {
                var be = firstArgs as BinaryExpression;
                methodField = BinaryExpressionHandler(be.Left, be.Right, be.NodeType).Data.ToString();
            }
            else if (firstArgs is MemberExpression)
            {
                //like a.Code
                memberExpression = firstArgs as MemberExpression;
                memberName       = memberExpression.Member.Name;
                var type = memberExpression.Expression.Type;
                if (type.IsSubclassOf(typeof(IModel)))
                {
                    var field = TypeCache.GetProperties(type, true)[memberExpression.Member.Name];
                    memberName = __DBAdapter.FieldNameFormat(field);
                }
                if (memberExpression.Expression.NodeType == ExpressionType.Parameter)
                {
                    methodField = FormatFieldPrefix(memberExpression.Expression.Type, memberName);
                    //var allConstant = true;
                    for (int i = argsIndex; i < allArguments.Count; i++)
                    {
                        bool isConstant2;
                        var  obj = GetParameExpressionValue(allArguments[i], out isConstant2);
                        arguments.Add(obj);
                    }
                }
                else
                {
                    //like Convert.ToDateTime(times)
                    var obj = ConstantValueVisitor.GetParameExpressionValue(firstArgs);
                    arguments.Add(obj);
                    for (int i = argsIndex; i < allArguments.Count; i++)
                    {
                        bool isConstant2;
                        var  obj2 = GetParameExpressionValue(allArguments[i], out isConstant2);
                        arguments.Add(obj2);
                    }
                }
            }
            else if (firstArgs is ConstantExpression)//按常量
            {
                //like DateTime.Parse("2016-02-11 12:56"),
                //isConstantMethod = true;
                var obj = ConstantValueVisitor.GetParameExpressionValue(firstArgs);
                arguments.Add(obj);
            }
            //else
            //{
            //    throw new CRLException("不支持此语法解析:" + args);
            //}

            if (nodeType == null)
            {
                nodeType = ExpressionType.Equal;
            }
            if (string.IsNullOrEmpty(methodField))
            {
                //当是常量转换方法

                var    method = mcExp.Method;
                object obj;
                if (mcExp.Method.IsStatic)//like DateTime.Parse("2016-02-11")
                {
                    obj = method.Invoke(null, arguments.ToArray());
                }
                else//like time.AddDays(1)
                {
                    if (arguments.Count == 0)
                    {
                        throw new Exception("未能解析" + exp);
                    }
                    var args1 = arguments.First();
                    arguments.RemoveAt(0);
                    obj = method.Invoke(args1, arguments.ToArray());
                }
                var exp2 = new CRLExpression.CRLExpression()
                {
                    Type = CRLExpression.CRLExpressionType.Value, Data = obj
                };
                //var cache = new MethodCallExpressionCacheItem() { CRLExpression = exp2, argsIndex = argsIndex, isConstantMethod = isConstantMethod, isStatic = mcExp.Method.IsStatic };
                //MethodCallExpressionCache[key] = cache;
                return(exp2);
            }
            var methodInfo = new CRLExpression.MethodCallObj()
            {
                Args = arguments, ExpressionType = nodeType.Value, MemberName = memberName, MethodName = methodName, MemberQueryName = methodField
            };
            methodInfo.ReturnType = mcExp.Type;
            #endregion
            var exp4 = new CRLExpression.CRLExpression()
            {
                Type = CRLExpression.CRLExpressionType.MethodCall, Data = methodInfo
            };
            //if (SettingConfig.UseLambdaCache && false)
            //{
            //    var cache2 = new MethodCallExpressionCacheItem() { CRLExpression = exp4, argsIndex = argsIndex, isConstantMethod = isConstantMethod };
            //    MethodCallExpressionCache[key] = cache2;
            //}
            return(exp4);

            #endregion
        }