LINQ一次更新多个元素

是否可以使用LINQ在List中为每个元素设置属性。

例如:

var users = from u in context.Users where u.Name == "George" select u; foreach (User us in users){ us.MyProp = false; } 

是否可以使其更清洁?

或者您可以将其转换为ToList()并使用ForEach方法。

 users.ToList().ForEach(u => u.MyProp = false); 

更新多个属性

 users.ToList().ForEach(u => { u.property1 = value1; u.property2 = value2; }); 

或者像这样

 (from u in context.Users where u.Name == "George" select u).ToList() .ForEach(u => u.MyProp = false); 

您可以创建自己的ForEach扩展方法:

 public static IEnumerable ForEach(this IEnumerable source, Action action) { foreach (var element in source) { action(element); } return source; } 

然后您的代码可以简化为:

 context.Users.Where(x => x.Name == "George").ForEach(u => u.MyProp = false); 

编辑:您也可以在调用action()之后返回每个项目(没有双关语),以保持延迟执行不变。

什么是清洁剂是非常主观的。 就个人而言,我觉得这种方法很难明白和简单:

 foreach (User us in users.Where(u => u.Name == "George")) { us.MyProp = false; } 

如果您对内存更新感兴趣,那就是数据库不会更新,那么您可以使用

 var users = (from u in context.Users where u.Name == "George" select u).ToList(); users.ForEach(u => u.MyProp = "Something"); 

怎么样:

  context.Users.Where(u => u.Name == "George").Select(u => u.MyProp = false); 

看起来很脏,但如果被问到(只是通过选择),我会这样做

 var users = from u in context.Users where u.Name == "George" select new User() { prop1 = u.prop1, prop2 = u.prop2, prop3 = true // update like here }; 

如果你想使用其他一些C#函数,你也可以使用linq函数并处理IEnumerable类型的列表。

 var users = context.Users.Where(u => u.Name == "George").ToList() .Select(p => new User() { prop1 = p.prop1, prop2 = p.prop2, prop3 = ComputeHash(p) // update like here }); 

由于.Select()之前的.ToList() ,上面的代码变为IEnumerable