2011-08-25 30 views
7

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

+1

Stai parlando LINQ to SQL? –

+0

Ho sempre ripristinato le stored procedure per eseguire aggiornamenti in blocco utilizzando XML come dati di massa, ma vorrei sapere se è possibile in LINQ. –

risposta

5

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(); 
+0

Sì, ho capito come farlo. La mia domanda è solo chiedendo se c'è una funzione LINQ che è più snella. – esastincy

1

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.

9

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 
+2

In aumento per evitare RBAR, la prima risposta non è veramente corretta. – Jasmine