LINQ

2011-03-15 12 views
17

kullanarak bir koleksiyonda özellik sorgulama ve güncelleştirme LINQ kullanarak bir koleksiyon içindeki belirli bir öğenin tek bir özelliğini güncelleştirmenin en başarılı/basit yolu nedir?LINQ

Örneğin

aşağıdaki Listesini varsa: LINQ onun "Ad" wheres bir Bilet öğenin "Seçilen" özelliğini güncellemek için nasıl kullanabilirim

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

mülkiyet Beach" değerine sahip ". SQL olurdu:

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

Ben bu ile doğru yolda olduğunu düşünüyorum ...

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

cevap

27

Daha sonra, sırasını değiştirmek ForEach operatörünü kullanabilirsiniz:

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

Not:

  • oLinq ForEach desteklemediği IEnumerable çünkü ihtiyaç vardır - bu linq-to ise okunabilmesi için bir daha geleneksel foreach(x in list) C# döngü sonra linq sorgu ve içine
  • bu ayırmayı daha iyi olabileceğini LINQ equivalent of foreach for IEnumerable<T>
  • bkz -sql, sonra değişikliklerinizi devam ettirmek için SubmitChanges()'u aramanız gerekecek.
+1

Neden ToList()? Elbette OP'daydı, ama muhtemelen gereksiz bir yük. –

+0

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

+0

'IEnumerable' '.ForEach()' desteklemiyor, bu yüzden gerekli. – BrokenGlass

1

Bunu söyleyerek başlayalım, böyle özellikleri ayarlamak için LINQ kullanmayın, LINQ'ların kullanılması gerektiği anlamına gelmez.

Siz sorgusunu yazarak, değiştirilecek satırları seçmek, bir döngüde değiştirmek ve değişiklikleri veritabanına göndermek için (LINQ to SQL) sorguyu yazın.

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

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

Jeff, lütfen LINQ'un neden bu şekilde kullanılmaması gerektiğini düşündüğünüz bir sebep var mı? ForEach() foreach döngüsünüzle tam olarak aynı şeyi yapıyor. – IsolatedStorage

+0

@IsolatedStorage ForEach, zaten LINQ'un bir parçası değildir ... Nedeni, aslında, mevcut nesneleri güncellemek için Nerede/Seç/Herhangi bir/Tümü bekler - sonuçta karışıklık neden olur ... Gecikmiş yürütme daha da eğlenceli hale getirir. –

8

Bit cevabını geç ama biz stuart tarafından Söz olarak ToList() dönüştürmek gerekmez ne düşündüğünü aslında sadece

şöyle (kod büyük bir parçasıdır) Stuart kod çimdik yapabileceğimiz
tickets 
    .Where(x => x.Name == "Beach") 
    .All(x => x.Selected = true); 

Diğer bir seçenek

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