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?


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.