Используя LINQ, если я хотел выполнить некоторый запрос и возвратить объект из запроса, но изменить только некоторые свойства в том объекте, как я сделаю это, не создавая новый объект и вручную установлю каждое свойство? Действительно ли это возможно?
Пример:
var list = from something in someList
select x // but change one property
I ' м не уверен, каков синтаксис запроса. Но вот пример расширенного выражения LINQ.
var query = someList.Select(x => { x.SomeProp = "foo"; return x; })
Он использует анонимный метод vs и выражение. Это позволяет использовать несколько операторов в одной лямбде. Таким образом, вы можете объединить две операции установки свойства и возврата объекта в этот несколько сжатый метод.
Не должно быть никакого магического хранения LINQ вы от этого. Не используйте проекцию, но она вернет анонимный тип.
User u = UserCollection.FirstOrDefault(u => u.Id == 1);
u.FirstName = "Bob"
Это изменит реальный объект, а также:
foreach (User u in UserCollection.Where(u => u.Id > 10)
{
u.Property = SomeValue;
}
Это невозможно со стандартными операторами запросов - это интегрированный языковой запрос, а не интегрированное обновление языка. Но вы можете скрыть свое обновление в методах расширения.
public static class UpdateExtension
{
public static IEnumerable<Car> ChangeColorTo(
this IEnumerable<Car> cars, Color color)
{
foreach (Car car in cars)
{
car.Color = color;
yield return car;
}
}
}
Теперь вы можете использовать его следующим образом.
cars.Where(car => car.Color == Color.Blue).ChangeColorTo(Color.Red);
var item = (from something in someList
select x).firstordefault();
Получит элемент
], а затем вы можете выполнить item.prop1 = 5;
, чтобы изменить конкретное свойство.
Или вы хотите получить список элементов из базы данных и изменить свойство prop1
для каждого элемента в этом возвращенном списке на указанное значение?
Если это так, вы можете сделать это (я делаю это в VB, потому что знаю это лучше):
dim list = from something in someList select x
for each item in list
item.prop1=5
next
( список
будет содержать все элементы, возвращенные с вашими изменениями)
Если вы просто хотите обновить свойство для всех элементов, тогда
someList.All(x => { x.SomeProp = "foo"; return true; })