2015-06-03 12 views
6

Quello che voglio ottenere è semplice query SQL: UPDATE TAVOLA COLONNA = COLONNA + 1Entity framework di aggiornamento di una colonna, aumentando il valore corrente per uno, senza selezionare

Esiste un modo per realizzarlo senza caricare prima tutti i record (migliaia) in memoria e passare in rassegna ogni record per incrementare la colonna e quindi salvarla nuovamente?

EDIT

Ho provato SQL prime 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.

+1

Qual è il problema con l'esecuzione del comando SQL? (Questa domanda è contrassegnata "sql") –

+0

'myContext.Database.ExecuteSqlCommand ("UPDATE TABLE SET COLUMN = COLUMN + 1"); ' –

+0

Penso che questo faccia ciò che vuoi: https://github.com/MikaelEliasson/EntityFramework.Utilities#update-by-query –

risposta

1

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

Le 2 alternative, che io sappia sono:

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

Citazione dalla loro pagina principale:

Batch Update e Delete

una corrente limitazioni di Entity Framework è che, al fine di aggiornare o cancellare un soggetto si deve prima recuperare 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'oggetto 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'entità prima di modificarla.

Eliminazione

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

Aggiornamento

//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"}); 
+0

EntityFramework.Extended non aiuterà. È una grande libreria, ma la funzione batch consente solo di impostare colonne di più record allo * stesso * valore. –

2

Ecco la soluzione. È possibile utilizzare il seguente codice:

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

sperare che sia d'aiuto.

+0

Questo è solo EF Core – Proviste

Problemi correlati