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