2011-03-15 15 views
17

Jaki jest najbardziej udany/prosty sposób aktualizowania pojedynczej właściwości określonego elementu w kolekcji przy użyciu LINQ?Zapytanie i aktualizowanie właściwości w kolekcji przy użyciu LINQ

Na przykład jeśli mam listę z następujących czynności:

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

jaki sposób można użyć LINQ do aktualizacji „wybrane” właściwość elementu Ticket wheres jego „imię” właściwość ma wartość „Brzeg ". W SQL byłoby:

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

Myślałem, że jestem na dobrej drodze z tym ...

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

Odpowiedz

27

Można zmienić kolejność, a następnie użyć operatora ForEach:

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

Uwaga:

  • że ToList() jest potrzebna, ponieważ IEnumerable nie obsługuje foreach w Linq - patrz LINQ equivalent of foreach for IEnumerable<T>
  • że dla czytelności może lepiej byłoby oddzielić to się do kwerendy LINQ, a następnie bardziej konwencjonalny foreach(x in list) C# pętli
  • jeśli to jest LINQ-do -sql, następnie musisz zadzwonić pod numer SubmitChanges(), aby utrzymać swoje zmiany.
+1

Dlaczego ToList()? Pewnie, że był w OP, ale prawdopodobnie nie jest to konieczne. –

+0

Powodem jest - http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet – Stuart

+0

'IEnumerable' nie obsługuje' .ForEach() ', więc jest to potrzebne. – BrokenGlass

1

Zacznę od stwierdzenia tego nie używać LINQ, aby ustawić właściwości tak, że nie sposób LINQ oznaczało być używany.

Musisz należy napisać zapytanie, aby wybrać wiersze do zmiany, zmienić je w pętli i przesłać zmiany do bazy danych (jeśli LINQ do 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, czy możesz podać powód, dla którego uważasz, że LINQ nie powinno być używane w ten sposób? ForEach() robi dokładnie to samo, co twoja pętla foreach. – IsolatedStorage

+0

@IsolatedStorage ForEach nie jest częścią LINQ tak czy owak ... Powód jest taki, że nikt się nie spodziewa Where/Select/Any/All, aby zaktualizować istniejące obiekty - w wyniku tego spowoduje to zamieszanie ... Opóźniona egzekucja czyni to jeszcze bardziej interesującym. –

8

trochę późno na odpowiedź, ale myślę, że nie trzeba konwertować do ToList() jak wspomniano przez Stuart co właściwie możemy zrobić, to po prostu dostosować kod Stuart (który jest świetny kawałek kodu) jak następuje

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

Inną opcją

tickets 
    .Where(x => x.Name == "Beach") 
    .All(x => { x.Selected = true; return true; }); 
Powiązane problemy