Il framework Entity aggiorna una colonna aumentando il valore corrente di uno senza selezionare

Quello che voglio ottenere è la query sql semplice: UPDATE TABLE SET COLUMN = COLUMN + 1

C’è un modo per farlo accadere senza prima caricare tutti i record (migliaia) in memoria e scorrere in loop ogni record per incrementare la colonna e quindi salvarla di nuovo?

MODIFICARE

Ho provato raw sql e ha funzionato. Devo decidere il provider sql dalla stringa di connessione e il nome dello schema del database dal contesto di connessione. Successivamente, userò la query sql corrispondente per aggiornare la tabella.

Per SQL, sembra UPDATE schemaname.TABLE SET COLUMN = COLUMN + 1 . per POSTGRESQL, devo raddoppiare il nome dello schema, il nome della tabella e il nome della colonna: UPDATE “schemaname”. “TABLE” SET “COLUMN” = “COLUMN” + 1 .

Con EF puro, hai ragione: devi caricare le quadro una ad una, impostare la proprietà e salvare. Molto inefficiente.

Le 2 alternative che conosco sono:

  1. Fornire SQL raw per eseguire l’istruzione UPDATE come desiderato.
  2. Utilizzare la libreria EntityFramework.Extended ( https://github.com/loresoft/EntityFramework.Extended ), che supporta sia gli UPDATE di massa che i DELETE con un aspetto EF naturale.

Citazione dalla loro pagina principale:

Aggiornamento ed eliminazione batch

Una limitazione attuale di Entity Framework è che per aggiornare o eliminare un’entity framework è necessario prima recuperarla in memoria. Ora nella maggior parte degli scenari questo va bene. Ci sono tuttavia alcuni senesi in cui le prestazioni ne risentirebbero. Inoltre, per le eliminazioni singole, l’object deve essere recuperato prima che possa essere eliminato richiedendo due chiamate al database. L’aggiornamento e l’eliminazione in gruppo elimina la necessità di recuperare e caricare un’ quadro prima di modificarla.

Eliminazione

 //delete all users where FirstName matches context.Users.Where(u => u.FirstName == "firstname").Delete(); 

Aggiornare

 //update all tasks with status of 1 to status of 2 context.Tasks.Update( t => t.StatusId == 1, t2 => new Task {StatusId = 2}); //example of using an IQueryable as the filter for the update var users = context.Users.Where(u => u.FirstName == "firstname"); context.Users.Update(users, u => new User {FirstName = "newfirstname"}); 

Ecco la soluzione. Puoi usare il seguente codice:

 context.Table.Where(x => x.Field1 > 0).Update(y => new Table { Field2 = y.Field2 + 1 }); 

spero che aiuti