/// <summary> /// 附加查询项 /// </summary> public void AddQuery(string sql, params object[] args) { if (!string.IsNullOrEmpty(sql)) { var query = new RawSql(sql, args); lock (this._oLock) _dbQueryables.Add(query); } }
/// <summary> /// 解析 SQL 命令 /// <para> /// 返回的已经解析语义中执行批次用 null 分开 /// </para> /// </summary> /// <param name="dbQueryables">查询语句</param> /// <returns></returns> public virtual List <Command> Resolve(List <object> dbQueryables) { List <Command> sqlList = new List <Command>(); ResolveToken token = null; foreach (var obj in dbQueryables) { if (obj == null) { continue; } if (obj is IDbQueryable) { IDbQueryable dbQueryable = (IDbQueryable)obj; dbQueryable.Parameterized = true; if (token == null) { token = new ResolveToken(); } if (token.Parameters == null) { token.Parameters = new List <IDbDataParameter>(8); } var cmd2 = dbQueryable.Resolve(0, true, token); sqlList.Add(cmd2); if (cmd2.Parameters != null && cmd2.Parameters.Count > 1000) { // 1000个参数,就要重新分批 sqlList.Add(null); token = new ResolveToken(); token.Parameters = new List <IDbDataParameter>(8); } } else if (obj is RawSql) { RawSql rawSql = (RawSql)obj; if (token == null) { token = new ResolveToken(); } if (token.Parameters == null) { token.Parameters = new List <IDbDataParameter>(8); } // 解析参数 object[] args = null; if (rawSql.Parameters != null) { args = rawSql.Parameters.Select(x => this.DbValue.GetSqlValue(x, token)).ToArray(); } string sql = rawSql.CommandText; if (args != null && args.Length > 0) { sql = string.Format(sql, args); } var cmd2 = new Command(sql, token.Parameters, CommandType.Text); sqlList.Add(cmd2); if (cmd2.Parameters != null && cmd2.Parameters.Count > 1000) { // 1000个参数,就要重新分批 sqlList.Add(null); token = new ResolveToken(); token.Parameters = new List <IDbDataParameter>(8); } } else if (obj is string) { string sql = obj.ToString(); sqlList.Add(new Command(sql)); } else { // 解析批量插入操作 List <IDbQueryable> bulkList = obj as List <IDbQueryable>; if (bulkList != null && bulkList.Count > 0) { this.ResolveBulk(sqlList, bulkList); } } } return(sqlList); }