2011-03-15 17 views
17

Qual è il modo più semplice/più semplice per aggiornare una singola proprietà di un elemento specifico all'interno di una raccolta utilizzando LINQ?Query e aggiornamento di una proprietà in una raccolta mediante LINQ

Per esempio se ho un elenco di quanto segue:

public class Ticket 
{ 
    public string Name { get; set; } 
    public string Code { get; set; } 
    public bool Selected { get; set; } 
} 

Come posso utilizzare LINQ per aggiornare la proprietà "Selected" di un elemento biglietto wheres il suo "Nome" proprietà ha il valore di "Beach ". In SQL sarebbe:

UPDATE Tickets SET Selected = true WHERE Name = 'Beach' 

Pensavo sulla strada giusta con questo ...

tickets.Select(x => { x.Selected = true; return x; }).ToList().Where(x => x.Name == "Beach"); 

risposta

27

È possibile modificare l'ordine, quindi usare l'operatore PerOgni:

tickets 
    .Where(x => x.Name == "Beach") 
    .ToList() 
    .ForEach(x => { x.Selected = true; }); 

Nota:

  • che il ToList() è necessario perché IEnumerable non supporta PerOgni in Linq - vedi LINQ equivalent of foreach for IEnumerable<T>
  • che per migliorare la leggibilità potrebbe essere meglio separare questo fuori in una query LINQ e poi un più convenzionale foreach(x in list) C# ciclo
  • se questo è LINQ to -sql, quindi dovrai chiamare lo SubmitChanges() per mantenere le tue modifiche.
+1

Perché ToList()? Certo era nell'OP, ma probabilmente è un sovraccarico non necessario. –

+0

Il motivo è: http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet – Stuart

+0

'IEnumerable' non supporta' .ForEach() ', quindi è necessario. – BrokenGlass

1

Lasciatemi iniziare dicendo questo, non utilizzare LINQ per impostare proprietà del genere, non è così che LINQ deve essere utilizzato.

È scrivere la query per selezionare le righe da modificare, modificarle in un ciclo e inviare le modifiche al database (se LINQ su SQL).

var query = tickets.Where(ticket => ticket.Name == "Beach"); 
foreach (var item in query) 
    item.Selected = true; 

// if LINQ to SQL 
context.SubmitChanges(); 
+6

Jeff, per favore puoi fornire un motivo per cui pensi che LINQ non dovrebbe essere usato in questo modo? ForEach() sta facendo esattamente la stessa cosa del tuo ciclo foreach. – IsolatedStorage

+0

@IsolatedStorage ForEach non fa comunque parte di LINQ ... Il motivo è che nessuno si aspetta effettivamente Dove/Seleziona/Qualsiasi/Tutti per aggiornare gli oggetti esistenti - in questo modo si crea confusione ... L'esecuzione ritardata lo rende ancora più divertente. –

8

po 'tardi per una risposta, ma penso che non dobbiamo convertire in ToList() come detto da stuart quello che in realtà possiamo fare è modificare il codice Stuart (che è grande pezzo di codice) come segue

tickets 
    .Where(x => x.Name == "Beach") 
    .All(x => x.Selected = true); 

Un'altra opzione

tickets 
    .Where(x => x.Name == "Beach") 
    .All(x => { x.Selected = true; return true; }); 
Problemi correlati