使用 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 更新属性的值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章