我有两个表: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,该属性/列都为null。
我的目标是执行您在中看到的数学运算foreach(var agent in taAgents)以修补每个代理的值,以使其不为null。
foreach(var agent in taAgents)
奇怪的是,当我运行此代码并在agent.AgentCommission = (formula)其上出现断点时,显示正在为AgentCommissision计算值,并且正在更新对象,但是在我的数据网格中显示了该值(仅用于测试)后,它不显示计算出的值。
agent.AgentCommission = (formula)
因此,对我而言,似乎该属性并未永久设置在该对象上。此外,如果我通过更新将这个新更新的对象持久化到数据库中,我怀疑计算出的AgentCommission是否会在那里设置。
在没有以相同方式设置表的情况下,是否有人可以查看代码并了解为什么我不保留该属性的值?
IEnumerable<T>s不 保证 更新的值将在枚举中持久存在。例如,a List将在每次迭代中返回相同的对象集,因此,如果更新属性,则将在多次迭代中保存该属性。但是,的许多其他实现IEnumerable每次都返回一组新的对象,因此所做的任何更改都不会持久。
IEnumerable<T>
List
IEnumerable
如果您需要存储和更新结果,请IEnumerable<T>下拉至“ List<T>使用”,.ToList()或将其投影到新的“ IEnumerable<T>使用.Select()了更改的应用”中。
List<T>
.ToList()
.Select()
要将其专门应用于您的代码,它将如下所示:
var transactions = (from t in db.Transactions where t.SellingPrice != 0 select t).ToList(); var taAgents = (from ta in db.TransactionAgents select ta).ToList(); 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;