C'è un modo per eseguire un aggiornamento collettivo su una raccolta con LINQ? Attualmente se ho un List<myObject>
e voglio aggiornare la colonna 1 a TEST uguale per ogni riga della lista, configurerei un ciclo foreach e quindi per ogni singolo oggetto imposterei il valore e quindi lo salverò. Funziona bene ma mi stavo chiedendo se ci fosse qualche metodo LINQ là fuori dove potrei fare qualcosa come myOject.BulkUpdate(columnName, value)
?Aggiornamento cumulativo con LINQ to SQL
risposta
Sembra che tu stia utilizzando LINQ to SQL e hai già le nozioni di base.
LINQ to SQL riguarda l'astrazione di tabelle in classi e in realtà non fornisce il "proiettile d'argento" o il dispositivo di una sola linea che si sta cercando.
L'unico modo per ottenere questo risultato è quello di fare in modo che un processo memorizzato prenda quel nome di colonna e un nuovo valore e implementa tale logica da solo.
db.MassUpdateTableColumn("Customer", "Name", "TEST");
....
CREATE PROC MassUpdateTableColumn
@TableName varchar(100), @ColumnName varchar(100), @NewVal varchar(100)
AS
/*your dynamic SQL to update a table column with a new val. */
Altrimenti, è come lei:
List<Customer> myCusts = db.Customers.ToList();
foreach(Customer c in myCusts)
{
c.Name = "TEST";
}
db.SubmitChanges();
Sì, ho capito come farlo. La mia domanda è solo chiedendo se c'è una funzione LINQ che è più snella. – esastincy
LINQ to SQL (o EF è per questo), è tutto di portare gli oggetti in memoria, manipolarli, e quindi aggiornandoli con richieste di database separate per ogni riga.
Nei casi in cui non è necessario idratare l'intero oggetto sul client, è molto meglio utilizzare le operazioni lato server (stored procs, TSQL) anziché LINQ. È possibile utilizzare i provider LINQ per rilasciare TSQL rispetto al database. Ad esempio, con LINQ to SQL è possibile utilizzare context.ExecuteCommand ("Aggiorna tabella set campo = valore dove condizione"), basta fare attenzione a SQL Injection.
L'esigenza qui è interamente possibile utilizzando le espressioni di Linq e l'eccellente libreria di Terry Aney su questo argomento.
Batch Updates and Deletes with LINQ to SQL
Un aggiornamento in termini di esempio che ha dato sarebbe la seguente:
using BTR.Core.Linq;
...
Context.myObjects.UpdateBatch
(
Context.myObjects.Where(x => x.columnName != value),
x => new myObject { columnName = value}
);
Edit (2017/01/20): Vale la pena di niente questo è ora disponibile sotto forma di pacchetto NuGet @https://www.nuget.org/packages/LinqPost/.
Install-Package LinqPost
In aumento per evitare RBAR, la prima risposta non è veramente corretta. – Jasmine
Stai parlando LINQ to SQL? –
Ho sempre ripristinato le stored procedure per eseguire aggiornamenti in blocco utilizzando XML come dati di massa, ma vorrei sapere se è possibile in LINQ. –