Eseguire l'aggiornamento collettivo condizionale in LINQ to SQL
-
22-09-2019 - |
Domanda
Ho una tabella SQL che memorizza le foto con un campo SortOrder SMALLINT. Gli utenti possono inserire nuove foto, specificando un criterio di ordinamento decimali per posizionare il nuovo record tra le 2 foto esistenti (o prima della prima foto). Il SortOrder verrà memorizzato come smallint, così quando rilevo che un inserimento si sposterà record esistenti, ho bisogno di aggiornare tutte le foto interessate ad incrementare il SortOrder dal 1.
Questo è facile da fare in una stored procedure, ma sto cercando il modo più efficace per raggiungere questo obiettivo con LINQ to SQL. Se devo tirare tutti i record al client, aggiornarli, e quindi inviare loro, quindi mi limiterò a bastone con la stored procedure che sta già lavorando e molto veloce.
Ecco il T-SQL che sposta i record:
UPDATE Photo
SET SortOrder = SortOrder + 1
WHERE AlbumId = @AlbumId
AND SortOrder >= CEILING(@SortOrder)
C'è un modo per fare questo tipo di aggiornamento di massa in LINQ to SQL senza dover recuperare i record?
Soluzione
LINQ to SQL non fa dichiarazioni CUD per i set, così bastone con l'implementazione esistente come sarebbe il migliore nello scenario.
Altri suggerimenti
Ho avuto un sacco di successo con questi ragazzi lavorano: http: //www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx
Sono solo usandolo in sviluppo per un paio di mesi, ma finora è stato abbastanza buono.
Sì, che avrebbe dovuto tirare giù i vostri oggetti, manipolarli, e spingere indietro.
È lo sProc qualcosa che il cliente è responsabile per la chiamata quando si spinge una nuova foto? Si potrebbe fare bene per configurarlo come un trigger, invece, in modo da l'applicazione non è direttamente responsabile per il passaggio aggiuntivo (facilmente dimenticato). Si tratta di un trade-off in complessità, naturalmente, e una questione di preferenze.
Una possibilità sarebbe quella di costruire la stringa SQL che era nella stored procedure ed eseguirlo tramite il tuo metodo di DataContext.ExecuteQuery. Facendo in questo modo avrebbe impedito i record di essere recuperati.