Обновлять сразу несколько элементов 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);