public bool CanProcessMany(DbUpdateTableGroup group) { if (group.Records.Count <= 1) { return(false); } switch (group.Operation) { case LinqOperation.Delete: return(group.Table.PrimaryKey.KeyColumns.Count == 1); case LinqOperation.Insert: if (!_driver.Supports(DbFeatures.InsertMany)) { return(false); } if (group.Table.Entity.Flags.IsSet(EntityFlags.HasIdentity | EntityFlags.HasRowVersion)) { return(false); } return(true); default: return(false); } }
public void AddUpdateGroup(DbUpdateTableGroup group) { SqlStatement sql = null; switch (group.Operation) { case LinqOperation.Insert: if (_db.CanProcessMany(group)) { // TODO: handle the case when there are too many params within 1 insert command var recGroups = GroupRecordsForInsertMany(group.Records, _driver.SqlDialect.MaxRecordsInInsertMany); foreach (var recGroup in recGroups) { sql = _sqlFactory.GetCrudInsertMany(group.Table, recGroup, _commandBuilder); _commandBuilder.AddInsertMany(sql, recGroup); } //foreach } else { foreach (var rec in group.Records) { CheckCurrentCommand(); sql = sql ?? _sqlFactory.GetCrudSqlForSingleRecord(group.Table, rec); _commandBuilder.AddRecordUpdate(sql, rec); } } break; case LinqOperation.Update: foreach (var rec in group.Records) { CheckCurrentCommand(); sql = _sqlFactory.GetCrudSqlForSingleRecord(group.Table, rec); _commandBuilder.AddRecordUpdate(sql, rec); } break; case LinqOperation.Delete: if (_db.CanProcessMany(group)) { sql = _sqlFactory.GetCrudDeleteMany(group.Table); _commandBuilder.AddDeleteMany(sql, group.Records, new object[] { group.Records }); } else { foreach (var rec in group.Records) { CheckCurrentCommand(); sql = sql ?? _sqlFactory.GetCrudSqlForSingleRecord(group.Table, rec); _commandBuilder.AddRecordUpdate(sql, rec); } } break; }//switch }
private void SaveTableGroupRecordsOneByOne(DbUpdateTableGroup tableGrp, DataConnection conn, DbUpdateSet updateSet) { foreach (var rec in tableGrp.Records) { if (updateSet.InsertsIdentity && rec.EntityInfo.Flags.IsSet(EntityFlags.ReferencesIdentity)) { rec.RefreshIdentityReferences(); } var cmdBuilder = new DataCommandBuilder(this._driver); var sql = SqlFactory.GetCrudSqlForSingleRecord(tableGrp.Table, rec); cmdBuilder.AddRecordUpdate(sql, rec); var cmd = cmdBuilder.CreateCommand(conn, sql.ExecutionType, sql.ResultProcessor); ExecuteDataCommand(cmd); } }
private void CreateTableGroups(DbModel dbModel, DbUpdateGroup group) { DbUpdateTableGroup currGroup = null; foreach (var rec in group.Records) { if (currGroup == null || rec.EntityInfo != currGroup.Table.Entity) { var tbl = dbModel.GetTable(rec.EntityInfo.EntityType); currGroup = new DbUpdateTableGroup(tbl, ToOperation(group.Order)); group.TableGroups.Add(currGroup); } currGroup.Records.Add(rec); } //foreach rec }