Führen bedingte Massenaktualisierung in Linq to SQL
-
22-09-2019 - |
Frage
Ich habe eine SQL-Tabelle, dass speichert Fotos mit einem Smallint SortOrder Feld. Benutzer können neue Bilder einfügen, eine Dezimalzahl Reihenfolge, um die Angabe die neue Datensatz zwischen zwei vorhandenen Fotos (oder vor dem ersten Foto) zu platzieren. Die SortOrder wird als Smallint gespeichert werden, so dass, wenn ich erkennen, dass eine Insertion vorhandene Datensätze verschieben, muss ich alle betroffenen Fotos zu aktualisieren, um die SortOrder um 1 zu erhöhen.
Das ist einfach in einer gespeicherten Prozedur zu tun, aber ich bin auf der Suche für den effizienteste Weg, dies mit Linq to SQL zu erreichen. Wenn ich alle Datensätze nach unten an den Client ziehen haben, aktualisieren sie und wirft sie dann einreichen, dann werde ich nur mit der gespeicherten Prozedur halten, die bereits arbeitet und sehr schnell.
Hier ist der T-SQL, dass die Datensätze Verschiebungen:
UPDATE Photo
SET SortOrder = SortOrder + 1
WHERE AlbumId = @AlbumId
AND SortOrder >= CEILING(@SortOrder)
Gibt es eine Möglichkeit, diese Art von Massenaktualisierung in Linq to SQL zu tun, ohne die Datensätze holen zu müssen?
Lösung
LINQ to SQL nicht tun CUD-Anweisungen für Sätze, so Stick mit Ihrer vorhandenen Implementierung, da es das Beste in Ihrem Szenario sei.
Andere Tipps
ich hatte viel Erfolg mit dieser Jungs Arbeit: http: //www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx
Ich habe es in der Entwicklung erst seit ein paar Monaten mit, aber bis jetzt ist es ziemlich gut.
Ja, Sie müssten Ihre Objekte nach unten ziehen, manipulieren sie, und schieben Sie sie zurück.
Ist das sproc etwas, dass der Client für den Aufruf verantwortlich ist, wenn ein neues Foto drängen? Sie könnten gut tun es als Auslöser einzurichten, statt, so dass Ihre Anwendung nicht direkt verantwortlich für das Extra ist (leicht vergessen) Schritt. Dies ist ein Kompromiss in Komplexität, natürlich, und eine Frage der Präferenz.
wäre eine Option, um die SQL-Zeichenfolge zu erstellen, die in der gespeicherten Prozedur war, und führen Sie es über Ihre DataContext.ExecuteQuery Methode. es auf diese Weise tun, verhindern würde geholt die Datensätze aus zu sein.