Aggiorna più righe in Entity Framework da un elenco di ID


95

Sto cercando di creare una query per il framework di entità che mi consentirà di prendere un elenco di ID e aggiornare un campo ad essi associato.

Esempio in SQL:

UPDATE Friends
SET msgSentBy = '1234'
WHERE id IN (1, 2, 3, 4)

Come si converte quanto sopra in entity framework?


Qual è la tua piattaforma database Oracle mysql ..
zee

Il mio database è Microsoft SQL
allencoded

Ci sono due progetti open source che lo consentono: EntityFramework.Extended ed E ntity Framework Extensions .
Peter Kerr

L'unica risposta corretta a questa domanda è: non puoi. Certo, puoi estrarre tutti i messaggi corrispondenti Frienddal database e aggiornare le loro proprietà msgSentBye salvare le modifiche. Ma EF licenzierà UPDATEdichiarazioni per ogni singolo record. Non è affatto lo stesso di un aggiornamento in blocco con una sola istruzione. Come detto, cerca una libreria di terze parti che offra aggiornamenti in blocco.
Gert Arnold

Risposte:


167

qualcosa come sotto

var idList=new int[]{1, 2, 3, 4};
using (var db=new SomeDatabaseContext())
{
    var friends= db.Friends.Where(f=>idList.Contains(f.ID)).ToList();
    friends.ForEach(a=>a.msgSentBy='1234');
    db.SaveChanges();
}

AGGIORNARE:

puoi aggiornare più campi come di seguito

friends.ForEach(a =>
                      {
                         a.property1 = value1;
                         a.property2 = value2;
                      });

posso aggiornare più di un campo nel foreach sopra che hai appena inviato ed è esattamente quello che ho chiesto. solo curioso se potessi fare di più? Inoltre non sembra più che SubmitChanges funzioni più. Sto usando l'ultimo framework di entità. Forse SaveChanges ()?
allencoded

10
ForEachè un metodo List, ed è generalmente sconsigliato da usare perché non è un modo di programmazione molto funzionale. Usa foreach (l'operatore) come una persona normale.
BlueRaja - Danny Pflughoeft

55
L'utilizzo di questa soluzione genera una query di aggiornamento per ogni elemento nell'elenco. C'è un modo per fare in modo che EF esegua una sola query come nella domanda? ( UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...))
RamNow

19
Tieni presente che questo è un modo piuttosto inefficiente per farlo dal punto di vista del database. Non solo questo emette una grande dichiarazione di selezione che coinvolge ogni riga della tabella Amici, ma emette un comando UPDATE separato per ogni record che viene aggiornato. Quindi, piuttosto che emettere un comando, stai emettendo potenzialmente molti molti comandi oltre a trasmettere un mucchio di dati dal tuo database.
d512

1
@ShekharPankaj, in pratica quello che vuoi fare è emettere un comando SQL come "UPDATE Friends SET msgSentBy = '1234' WHERE ID IN (1, 2, 3, 4)". Non penso che EF abbia un supporto diretto per farlo. Credo che ci siano alcune soluzioni di terze parti a questo ( stackoverflow.com/questions/12751258/batch-update-delete-ef5 ) ma non le ho usate. Le altre opzioni consiste nell'usare ADO.NET non elaborato invece di EF.
d512

-1
var idList=new int[]{1, 2, 3, 4};
var friendsToUpdate = await Context.Friends.Where(f => 
    idList.Contains(f.Id).ToListAsync();

foreach(var item in previousEReceipts)
{
  item.msgSentBy = "1234";
}

Puoi usare foreach per aggiornare ogni elemento che soddisfa la tua condizione.

Ecco un esempio in modo più generico:

var itemsToUpdate = await Context.friends.Where(f => f.Id == <someCondition>).ToListAsync();

foreach(var item in itemsToUpdate)
{
   item.property = updatedValue;
}
Context.SaveChanges()

In generale molto probabilmente userete metodi asincroni con await for db queries.


Non vedo come questo aggiunga qualcosa alla risposta esistente. Fondamentalmente lo ripete.
Gert Arnold

la differenza principale è usare foreach invece di friends.ForEach
Raphael Pinel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.