Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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
        }
Beispiel #3
0
 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);
     }
 }
Beispiel #4
0
        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
        }