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