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 })); } }