2011-03-15 66 views
17

Cách đơn giản nhất/đơn giản nhất để cập nhật một thuộc tính duy nhất của một mục cụ thể trong bộ sưu tập bằng LINQ là gì?Truy vấn và cập nhật thuộc tính trong bộ sưu tập bằng LINQ

Ví dụ nếu tôi có một danh sách những điều sau đây:

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

Làm thế nào tôi có thể sử dụng LINQ to cập nhật "được chọn" tài sản của một mục Ticket wheres "Tên" của bất động sản có giá trị của "bãi biển ". Trong SQL nó sẽ là:

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

Tôi nghĩ rằng tôi đã đi đúng hướng với điều này ...

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

Trả lời

27

Bạn có thể thay đổi thứ tự, sau đó sử dụng các nhà điều hành ForEach:

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

Lưu ý:

  • rằng ToList() là cần thiết vì IEnumerable không hỗ trợ ForEach trong LINQ - xem LINQ equivalent of foreach for IEnumerable<T>
  • rằng để có thể đọc nó có thể là tốt hơn để tách này ra thành một truy vấn LINQ và sau đó một thường hơn foreach(x in list) C# vòng lặp
  • nếu đây là LINQ-to -sql, sau đó bạn sẽ cần phải gọi SubmitChanges() để duy trì các thay đổi của bạn.
+1

Tại sao ToList()? Chắc chắn đó là trong OP, nhưng nó có lẽ là chi phí không cần thiết. –

+0

Lý do là - http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet – Stuart

+0

'IEnumerable' không hỗ trợ' .ForEach() ', vì vậy cần thiết. – BrokenGlass

1

Hãy để tôi bắt đầu bằng cách nói điều này, không sử dụng LINQ để đặt thuộc tính như vậy, đó không phải là cách LINQ có nghĩa là để được sử dụng.

Bạn nên viết truy vấn để chọn các hàng cần thay đổi, thay đổi chúng trong vòng lặp và gửi thay đổi cho cơ sở dữ liệu (nếu LINQ to 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, xin bạn có thể cung cấp một lý do tại sao bạn nghĩ LINQ không nên được sử dụng theo cách này? Các ForEach() đang làm chính xác điều tương tự như vòng lặp foreach của bạn. – IsolatedStorage

+0

@IsolatedStorage ForEach không phải là một phần của LINQ anyway ... Lý do là không ai thực sự mong đợi ở đâu/Chọn/Bất kỳ/Tất cả để cập nhật các đối tượng hiện có - kết quả làm như vậy sẽ gây nhầm lẫn ... Thực hiện trì hoãn làm cho nó thú vị hơn. –

8

Bit trễ cho một câu trả lời, nhưng tôi nghĩ chúng ta không cần phải chuyển đổi sang ToList() Như đã đề cập bởi stuart những gì thực sự chúng ta có thể làm là chỉ cần tinh chỉnh Stuart mã (đó là mảnh lớn của code) như sau

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

Một lựa chọn khác

tickets 
    .Where(x => x.Name == "Beach") 
    .All(x => { x.Selected = true; return true; }); 
Các vấn đề liên quan