Aktualisieren Sie mehrere Zeilen in Entity Framework aus einer Liste von IDs

93

Ich versuche, eine Abfrage für das Entitätsframework zu erstellen, mit der ich eine Liste von IDs erstellen und ein mit ihnen verknüpftes Feld aktualisieren kann.

Beispiel in SQL:

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

Wie konvertiere ich das oben genannte in ein Entity Framework?

Allencodiert
quelle
Was ist Ihre Datenbankplattform Oracle MySQL ..
Zee
Meine Datenbank ist Microsoft SQL
Allencoded
Es gibt zwei Open Source-Projekte, die dies ermöglichen: EntityFramework.Extended und E ntity Framework Extensions .
Peter Kerr

Antworten:

159

so etwas wie unten

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();
}

AKTUALISIEREN:

Sie können mehrere Felder wie folgt aktualisieren

friends.ForEach(a =>
                      {
                         a.property1 = value1;
                         a.property2 = value2;
                      });
Damith
quelle
Kann ich mehr als ein Feld im oben genannten Foreach aktualisieren, das Sie gerade gesendet haben und das genau das ist, wonach ich gefragt habe? nur neugierig, ob du mehr tun könntest? Sieht auch nicht so aus, als ob SubmitChanges mehr funktioniert. Ich verwende das neueste Entity-Framework. Vielleicht SaveChanges ()?
Allencoded
10
ForEachist eine Methode List, und es wird generell davon abgeraten, sie zu verwenden, da sie keine sehr funktionale Art der Programmierung darstellt. Verwenden Sie foreach (den Bediener) einfach wie eine normale Person.
BlueRaja - Danny Pflughoeft
53
Die Verwendung dieser Lösung generiert eine Aktualisierungsabfrage für jedes Element in der Liste. Gibt es eine Möglichkeit, EF dazu zu bringen, nur eine Abfrage wie in der Frage auszuführen? ( UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...))
RamNow
19
Beachten Sie, dass dies aus Datenbanksicht ein ziemlich ineffizienter Weg ist, dies zu tun. Dies gibt nicht nur eine große select-Anweisung aus, die jede Zeile aus der Friends-Tabelle betrifft, sondern gibt auch einen separaten UPDATE-Befehl für jeden aktualisierten Datensatz aus. Anstatt einen Befehl auszugeben, geben Sie möglicherweise viele, viele Befehle aus und streamen eine Reihe von Daten aus Ihrer Datenbank.
d512
1
@ShekharPankaj, im Grunde möchten Sie einen SQL-Befehl wie "UPDATE Friends SET msgSentBy = '1234' WHERE ID IN (1, 2, 3, 4)" ausgeben. Ich glaube nicht, dass EF dafür direkte Unterstützung hat. Ich glaube, es gibt einige Lösungen von Drittanbietern ( stackoverflow.com/questions/12751258/batch-update-delete-ef5 ), aber ich habe sie nicht verwendet. Die andere Option ist die Verwendung von ADO.NET anstelle von EF.
d512