2015-06-03 5 views
6

Co chcę osiągnąć jest prosty zapytań SQL: UPDATE tabeli zamieszczonej KOLUMNA = KOLUMNA + 1Entity Framework aktualizacja jedna kolumna poprzez zwiększenie wartości bieżącej o jeden bez wybierz

Czy istnieje sposób, aby to się stało bez wczytania najpierw wszystkich rekordów (tysięcy) do pamięci i przechodzenia przez każdy rekord w celu zwiększenia kolumny, a następnie jej zapisania?

EDIT

Próbowałem surowego sql i to działało. Muszę zdecydować o dostawcy sql z ciągu połączenia i nazwy schematu bazy danych z kontekstu połączenia. Następnie użyję odpowiedniej kwerendy sql, aby zaktualizować tabelę.

Dla SQL wygląda na UPDATE schemaname.TABLE SET COLUMN = COLUMN + 1. dla POSTGRESQL, muszę podwójnie zacytować nazwę schematu, nazwę tabeli i nazwę kolumny: AKTUALIZUJ "schemaname". "TABELA" USTAWIENIA "KOLUMNA" = "KOLUMNA" + 1.

+1

Na czym polega problem z uruchomieniem polecenia SQL? (To pytanie jest oznaczone jako "sql") –

+0

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

+0

Myślę, że robi to, co chcesz: https://github.com/MikaelEliasson/EntityFrameworkUtilities#update-by-query –

Odpowiedz

1

Z czystym EF, masz rację: musisz załadować elementy jeden po drugim, ustawić właściwość i zapisać. Bardzo nieefektywny.

W 2 alternatywy, które znam są:

  1. Zapewnić surowego SQL do wykonania instrukcji UPDATE jak chcesz.
  2. Użyj biblioteki EntityFramework.Extended (https://github.com/loresoft/EntityFramework.Extended), która obsługuje zarówno duże UPDATE i DELETE z naturalnym odczuciem EF.

Cytat z ich strony głównej:

Batch Update i Delete

prąd ograniczenia Entity Framework jest, że aby zaktualizować lub usunąć jednostkę trzeba najpierw pobrać to do pamięci. Teraz w większości scenariuszy jest to w porządku. Istnieje jednak kilka senerios, w których wydajność będzie cierpieć. Ponadto w przypadku pojedynczych usunięć obiekt musi zostać pobrany przed usunięciem, wymagając dwóch wywołań do bazy danych. Aktualizowanie i usuwanie partii eliminuje konieczność pobierania i ładowania jednostki przed jej modyfikacją.

Usuwanie

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

Aktualizacja

//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 nie pomoże. Jest to świetna biblioteka, ale funkcja wsadowa pozwala tylko ustawić kolumny wielu rekordów na * tę samą wartość *. –

2

Oto rozwiązanie. Możesz użyć następującego kodu:

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

mam nadzieję, że to pomaga.

+0

To tylko EF Core – Proviste

Powiązane problemy