我想改变一个LINQ查询结果对象的一些属性,而不需要创建一个新的对象和手动设置每个属性。这可能吗?

例子:

var list = from something in someList
           select x // but change one property

当前回答

这对于标准查询操作符是不可能的——它是语言集成查询,而不是语言集成更新。但是您可以将更新隐藏在扩展方法中。

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);

其他回答

使用ForEach

var list = from something in someList;
list.ForEach(x => x.Property = value);
User u = UserCollection.Single(u => u.Id == 1);
u.FirstName = "Bob"

在2020年,我使用MoreLinq管道方法。https://morelinq.github.io/2.3/ref/api/html/M_MoreLinq_MoreEnumerable_Pipe__1.htm

如果你想用Where子句更新项,使用.Where(…)将截断你的结果:

list = list.Where(n => n.Id == ID).Select(n => { n.Property = ""; return n; }).ToList();

你可以像这样更新列表中的特定项目:

list = list.Select(n => { if (n.Id == ID) { n.Property = ""; } return n; }).ToList();

总是返回项目,即使你不做任何改变。这样它将被保存在列表中。

我不确定查询语法是什么。下面是扩展的LINQ表达式示例。

var query = someList.Select(x => { x.SomeProp = "foo"; return x; })

它所做的是使用匿名方法vs和表达式。这允许您在一个lambda中使用多个语句。因此,您可以将设置属性和返回对象这两个操作结合到这个稍微简洁的方法中。