Example #1
0
        ICode ResolveExpressionObject(Expression exp)
        {
            object obj;

            if (!ExpressionToObject.GetExpressionObject(exp, out obj))
            {
                throw new NotSupportedException();
            }

            //object symbol.
            //for example enum.
            var symbol = exp.Type.GetObjectConverter();

            if (symbol != null)
            {
                return(symbol.Convert(obj));
            }

            //IDbParam.
            if (typeof(IDbParam).IsAssignableFromEx(exp.Type))
            {
                string name   = string.Empty;
                MetaId metaId = null;
                var    member = exp as MemberExpression;
                if (member != null)
                {
                    name   = member.Member.Name;
                    metaId = new MetaId(member.Member);
                }
                var param = obj as IDbParam;
                //use field name.
                return(new ParameterCode(name, metaId, param));
            }

            //sql.
            //example [ IN(exp) ]
            var sqlExp = obj as Sql;

            if (sqlExp != null)
            {
                Type type  = null;
                var  types = sqlExp.GetType().GetGenericArgumentsEx();
                if (0 < types.Length)
                {
                    type = types[0];
                }
                return(SqlCode.Create(sqlExp.Code));
            }

            //others.
            //Even if it is not a supported type, if it is correctly written it will be cast to the caller.
            {
                string name   = string.Empty;
                MetaId metaId = null;
                var    member = exp as MemberExpression;
                if (member != null)
                {
                    name   = member.Member.Name;
                    metaId = new MetaId(member.Member);
                }

                //use field name.
                return(new ParameterCode(name, metaId, new DbParamValueOnly()
                {
                    Value = obj
                }));
            }
        }