使用 LINQ 更新属性的值 [重复]

Posted

技术标签:

【中文标题】使用 LINQ 更新属性的值 [重复]【英文标题】:Update value of a property using LINQ [duplicate] 【发布时间】: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 中做到这一点,而不是如果他应该这样做。顺便说一句,看看原来的问题(这是一个被骗的问题),你会对实际上不应该发生的事情感到惊讶 【参考方案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 这是真的,但您可以更改属性。查看建议的副本 集合必须重新分配给新的返回值才能工作,因为实际上它仍然只是选择,但对选择进行了修改。 不过还是谢谢兄弟

以上是关于使用 LINQ 更新属性的值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 LINQ 更新列表 [重复]

使用 LINQ 跨多个属性查找重复项

在 getter 属性上使用 LInq 'Select Distinct' [重复]

LINQ按名称选择属性[重复]

与 LINQ 的类的属性不同 [重复]

Linq distinct 方法仅适用于特定属性[重复]