private void GetDynamicOrDefaultSql(QueryInfo info) { if (info.NamedQuery == null) { if (string.IsNullOrEmpty(info.CustomSQL))//从Type获取SQL { info.CustomSQL = GetMappedOrDefaultSql(info.GetMappingType()); } else//已经制定SQL,动态化! { StatementParser.ParseDynamicSql(info); } } }
/// <summary> /// 执行sql(注:有加入缓存读写的表格不可以使用该方法) /// </summary> /// <param name="mapSql"></param> /// <param name="param">支持Dictionary类型</param> /// <returns></returns> public int Execute(string mapSql, IDictionary <string, object> param) { if (mapSql.IndexOf(' ') > 0) { CheckSqlInject(mapSql); } string sql = StatementParser.ParseDynamicSql(mapSql, param); CheckNoParams(sql, param); //if (sql.IndexOf(";") > 0) // sql = sql.Replace("\r\n", " "); //Dao.TxBegin(); return(Dao.Execute(sql, param)); }
/// <summary> /// 根据T创建select,结合param生成where语句 /// </summary> string AddParamToSqlWhere(Type type, string mapSql, ref object param) { if (string.IsNullOrEmpty(mapSql))//类型获取 { return(GetMappedOrDefaultSql(type)); } if (param != null) { QueryInfo info = new QueryInfo();//添加当前参数,通过参数名可以控制语句类型:EQ,LK,GT等 ////参数类型Anonymous对象? 转换为IDictionary //if (!typeof(System.Collections.IDictionary).IsAssignableFrom(param.GetType())) //{ // var props = Dappers.Context.Reflection.GetHolder(param.GetType()); // Dictionary<string, Dappers.Context.GetHandler> getters = props.Getters; // Dictionary<string, object> di = new Dictionary<string, object>(getters.Count); // foreach(var getter in getters){ // di.Add(getter.Key, // getter.Value(param) ); // } // param = di; //} info.Parameters = (IDictionary <string, object>)param; if (!string.IsNullOrEmpty(mapSql))//重新映射 { info.CustomSQL = mapSql; } StatementParser.ParseDynamicSql(info); //配置语句 动态构造 param = info.Parameters; //参数已被修改 return(info.ToSQLString() + info.ToOrderBy()); } else { string sql = StatementParser.GetMappedStaticSql(mapSql); if (sql.Equals(mapSql) && sql.IndexOf(" ") < 0) { throw new ArgumentOutOfRangeException("无效的Sql配置项,请检查Key是否正确:" + mapSql); } return(sql); } }
/// <typeparam name="T">为空时,从T创建语句</typeparam> public T SelectOne <T>(string mapSql, object param) { CheckSqlInject(mapSql); string sql = null; if (param is string) { param = new Dictionary <string, object>() { { GetPrimaryKey(typeof(T)), param } }; sql = StatementParser.ParseDynamicSql(mapSql, param as Dictionary <string, object>); } else { sql = AddParamToSqlWhere(typeof(T), mapSql, ref param); } return(Dao.Query <T>(sql, param).SingleOrDefault()); }