Обновлять сразу несколько элементов LINQ
Можно ли установить свойство для каждого элемента из списка с помощью LINQ.
например:
var users = from u in context.Users where u.Name == "George" select u;
foreach (User us in users){
us.MyProp = false;
}
Можно ли сделать его более чистым?
Ответы
Ответ 1
Или вы можете преобразовать его в 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);
Ответ 2
Вы можете создать свой собственный метод расширения ForEach:
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (var element in source)
{
action(element);
}
return source;
}
Тогда ваш код можно упростить до:
context.Users.Where(x => x.Name == "George").ForEach(u => u.MyProp = false);
EDIT: вы также можете возвратить каждый элемент после вызова действия() (без каламбура), чтобы оставить отложенное исполнение нетронутым.
Ответ 3
Что такое чище, вполне субъективно. Лично я нахожу, что этот подход трудно превзойти для ясности и простоты:
foreach (User us in users.Where(u => u.Name == "George"))
{
us.MyProp = false;
}
Ответ 4
Если вам интересно обновление в памяти, то есть база данных не будет обновлена, вы можете использовать
var users = (from u in context.Users where u.Name == "George" select u).ToList();
users.ForEach(u => u.MyProp = "Something");
Ответ 5
Как насчет:
context.Users.Where(u => u.Name == "George").Select(u => u.MyProp = false);