更新IEnumerable中的项目属性,但该属性不保持设置?

我有两个表:Transactions和TransactionAgents。 TransactionAgents具有TransactionID的外键。 相当标准。

我也有这个代码:

BrokerManagerDataContext db = new BrokerManagerDataContext();

var transactions = from t in db.Transactions where t.SellingPrice != 0 select t; var taAgents = from ta in db.TransactionAgents select ta; foreach (var transaction in transactions) { foreach(var agent in taAgents) { agent.AgentCommission = ((transaction.CommissionPercent / 100) * (agent.CommissionPercent / 100) * transaction.SellingPrice) - agent.BrokerageSplit; } } dataGridView1.DataSource = taAgents; 

基本上,一个TransactionAgent有一个名为AgentCommission的属性/列,对于我的数据库中的所有TransactionAgent,它是空的。

我的目标是执行您在foreach(var agent in taAgents)看到的mathforeach(var agent in taAgents)来修补每个代理的值,使其不为空。

奇怪的是,当我运行此代码和agent.AgentCommission = (formula)上的agent.AgentCommission = (formula)它显示值为AgentCommissision计算和对象正在更新,但它显示在我的数据网格(仅用于testing)后,它不显示它计算的值。

所以,对我而言,这个物业似乎并没有被永久地设定在物体上。 更重要的是,如果我坚持这个新更新的对象回到数据库更新,我怀疑计算的AgentCommission将被设置在那里。

没有我的表设置相同的方式,有没有人可以看看代码,看看为什么我不保留财产的价值?

IEnumerable<T>保证更新的值将在枚举中持续存在。 例如,一个List将在每次迭代中返回相同的一组对象,所以如果你更新一个属性,它将被保存在迭代中。 但是, IEnumerable的许多其他实现每次都会返回一组新对象,因此所做的任何更改都不会持久。

如果您需要存储和更新结果,请使用.ToList()IEnumerable<T>拉下到List<T>或者使用.Select()应用更改将其投影到新的IEnumerable<T>

假设您正在使用LINQ to SQL,如果EnableObjectTracking为false,则每次运行查询时都会构造新的对象。 否则,每次都会得到相同的对象实例,并且您的更改将保留下来。 但是,像其他人一样,不是让查询执行多次,而是将结果caching在列表中。 你不仅可以得到你想要的工作,而且可以减less数据库的往返次数。

具体来说,问题是每次访问IEnumerable时,都会枚举集合。 在这种情况下,集合是对数据库的调用。 在第一部分中,您将从数据库获取值并更新它们。 在第二部分中,您将再次从数据库中获取值,并将其设置为数据源(或者,迂回地将枚举器设置为数据源,然后从数据库获取值)。

使用.ToList()或类似的方法将结果保存在内存中,并且每次访问相同的集合。

我发现我必须在列表中find我想要修改的项目,提取副本,修改副本(通过递增其count属性),从列表中删除原始项目并添加修改后的副本。 var x = stats.Where(d => d.word == s).FirstOrDefault(); var statCount = stats.IndexOf(x); x.count ++; stats.RemoveAt(statCount); stats.Add(X);