2015-06-03 2 views
6

Was will ich erreichen, ist die einfache SQL-Abfrage: UPDATE einspaltige Tabelle SET = COLUMN + 1Entity Framework Update eine Spalte durch den aktuellen Wert zu erhöhen, indem man ohne select

Gibt es einen Weg, um es möglich zu machen ohne zuerst alle Datensätze (Tausende) in den Speicher zu laden und jeden Datensatz durchzulaufen, um die Spalte zu inkrementieren und dann wieder zu speichern?

EDIT

Ich versuchte roh SQL und es funktionierte. Ich muss den SQL-Provider aus der Verbindungszeichenfolge und dem Datenbankschema-Namen aus dem Verbindungskontext auswählen. Danach werde ich die entsprechende SQL-Abfrage verwenden, um die Tabelle zu aktualisieren.

Für SQL sieht es aus wie UPDATE schemaname.TABLE SET COLUMN = COLUMN + 1. für POSTGRESQL, muss ich Schemanamen, Tabellenname und Spaltennamen doppelt angeben: UPDATE "schemaname". "TABELLE" SET "COLUMN" = "SPALTE" + 1.

+1

Was ist das Problem beim Ausführen des SQL-Befehls? (Diese Frage ist markiert "sql") –

+0

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

+0

Ich denke, das ist, was Sie wollen: https://github.com/MikaelEliasson/EntityFramework.Utilities#update-by-query –

Antwort

1

Mit reinem EF haben Sie Recht: Sie müssen die Entitäten einzeln laden, die Eigenschaft festlegen und speichern. Sehr ineffizient.

Die zwei Alternativen, die ich kenne, sind:

  1. raw SQL Geben Sie die UPDATE-Anweisung auszuführen, wie Sie es möchten.
  2. Verwenden Sie die EntityFramework.Extended-Bibliothek (https://github.com/loresoft/EntityFramework.Extended), die sowohl Bulk-UPDATE als auch DELETE mit einem natürlichen EF-Feeling unterstützt.

Zitat aus ihrer Hauptseite:

Batch Update und Delete

A derzeitigen Beschränkungen des Entity Framework ist, dass, um ein Objekt, das Sie zuerst müssen aktualisieren oder löschen abrufen es in die Erinnerung. In den meisten Szenarien ist das nun in Ordnung. Es gibt jedoch einige Szenarien, in denen die Leistung leiden würde. Außerdem muss das Objekt für einzelne Löschvorgänge abgerufen werden, bevor es gelöscht werden kann, sodass zwei Aufrufe an die Datenbank erforderlich sind. Beim Aktualisieren und Löschen von Batches müssen keine Entitäten abgerufen und geladen werden, bevor sie geändert werden.

löschen

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

aktualisieren

//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 wird nicht helfen. Es ist eine großartige Bibliothek, aber mit der Stapelfunktion können Sie nur Spalten mit mehreren Datensätzen auf den gleichen Wert setzen. –

2

Hier ist die Lösung. Sie können den folgenden Code verwenden:

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

Hoffnung, dass es hilft.

+0

Dies ist nur EF Core – Proviste

Verwandte Themen