使用LINQ查询和更新集合中的属性

时间:2011-03-15 20:13:26

标签: linq

使用LINQ更新集合中特定项目的单个属性的最简单/最简单方法是什么?

例如,如果我有以下列表:

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

如果“Name”属性的值为“Beach”,我如何使用LINQ更新Ticket项的“Selected”属性。在SQL中它将是:

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

我以为我正走在正确的轨道上......

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

3 个答案:

答案 0 :(得分:31)

您可以更改顺序,然后使用ForEach运算符:

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

注意:

  • 需要ToList(),因为IEnumerable不支持Linq中的ForEach - 请参阅LINQ equivalent of foreach for IEnumerable<T>
  • 为了便于阅读,最好将其分为linq查询,然后是更传统的foreach(x in list) C#循环
  • 如果这是linq-to-sql,那么您需要调用SubmitChanges()才能保留更改。

答案 1 :(得分:8)

回答迟到了,但我认为我们不必转换为ToList(),正如斯图尔特所提到的那样我们能做的只是调整Stuart代码(这是一段很棒的代码)如下

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

另一个选择

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

答案 2 :(得分:1)

让我先说这个,不要使用LINQ设置这样的属性,这不是LINQ的用法。

应该编写查询以选择要更改的行,在循环中更改它们,并将更改提交到数据库(如果是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();