【问题标题】:Update value of a property using LINQ [duplicate]使用 LINQ 更新属性的值 [重复]
【发布时间】:2018-04-29 20:26:12
【问题描述】:

我有以下类结构

public class OfferModelCollection
{
    List<OfferModel> offers = new List<OfferModel>();
}

public class OfferModel
{
     public int ID { get; set; }
     public ProviderModel Provider { get; set; }
     public ProviderType ProviderType { get; set; }   //Enum

}

public class ProviderModel : BaseModel, IIdentity
{
     public string ProviderCode { get; set; }
     public string ProviderName { get; set; }   
}

我现在正在尝试更新那些offers 中的ProviderType,其Provider.ProviderCode 与某个字符串值匹配。如何在 LINQ 中实现它?

类似这样的:

offersVM.Offers.Where(x=>x.Provider.ProviderCode.Contains("p10"))).ProviderType = ProviderType.Default;

【问题讨论】:

  • 你的错误是什么?
  • Linq 中的 Q 代表“查询”,意思是查询,而不是更新。
  • 您可以使用.ForEach(),它不是 linq,而是您真正要寻找的 1 行 foreach
  • 这其实是一个有趣的问题。简短的回答你不应该。 Enumerable 应该是不可变的,“正确”的方式是在选择创建新对象并复制原始对象时创建新对象。由于 Body 表达式不适用于 IQueryable,这是唯一的方法。
  • @FilipCordas 您的简短回答不是答案。他在问如何在 linq 中做到这一点,而不是如果他应该这样做。顺便说一句,看看原来的问题(这是一个被骗的问题),你会对实际上不应该发生的事情感到惊讶

标签: c# linq


【解决方案1】:

您必须使用foreach(至少这是最常见且最有效的方法)。

var toUpdate = offersVM.Offers.Where(x=> x.Provider.ProviderCode.Contains("p10"));

foreach(var x in toUpdate)
    x.ProviderType = ProviderType.Default;

使用 LINQ 查询数据源,而不是修改它!

【讨论】:

  • 不管它是不是一个好主意,它仍然是一个愚蠢问题的重复问题......
  • @EpicKip:副本实际上是在要求修改源的 LINQ 查询,这个问题的回答很简单:不要这样做。这个问题要求相同,但似乎 OP 只是不知道他可以使用简单的foreach。所以可以给他一个有用的答案。
  • @EpicKip:我没有时间回答“重复”,虽然还没有好的答案。我经常看到这种模式(query.ToList().ForEach(...)。我每次都会哭,但它仍然在那里投票。但我可以回答这个问题来帮助 OP。
  • 那么为什么不改用规范的方法呢?
  • @DavidG:它已经作为 dup 关闭,但它会导致 OP 采用错误的方法,因此为他的具体问题提供解决方案是有帮助的here
【解决方案2】:

使用 foreach

foreach (var item in offersVM.Offers.Where(x=>x.Provider.ProviderCode.Contains("p10")))
{
    item.ProviderType = ProviderType.Default;
}

Linq 用于访问不变异

【讨论】:

  • 这不是 Linq。
  • 请不要重复回答;] 谢谢
  • 关于Linq is for accessing not mutating 这是真的,但您可以更改属性。查看建议的副本
  • 集合必须重新分配给新的返回值才能工作,因为实际上它仍然只是选择,但对选择进行了修改。
  • 不过还是谢谢兄弟
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 2015-07-09
  • 2021-05-27
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
相关资源
最近更新 更多