我有两个表:Transactions 和 TransactionAgents。 TransactionAgents 有一个名为 TransactionID 的 Transactions 外键。相当标准。
我也有这个代码:
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)
中看到的数学运算,以修补每个代理的值,使其不为空。
奇怪的是,当我运行此代码并在 agent.AgentCommission = (formula)
上设置断点时,它显示正在计算 AgentCommission 的值并且正在更新对象,但是在它显示在我的datagrid(仅用于测试),它不显示它计算的值。
所以,对我来说,Property 似乎并没有永久设置在对象上。更重要的是,如果我通过更新将这个新更新的对象持久保存回数据库,我怀疑计算出的 AgentCommission 是否会设置在那里。
如果我的表没有以相同的方式设置,是否有人可以查看代码并了解为什么我不保留该属性的值?
最佳答案
IEnumerable<T>
s 不保证更新的值将在枚举中持续存在。例如,List
将在每次迭代中返回相同的对象集,因此如果您更新属性,它将在迭代中保存。但是,IEnumerable
的许多其他实现s 每次都返回一组新的对象,因此所做的任何更改都不会保留。
如果需要存储和更新结果,拉取 IEnumerable<T>
下降到 List<T>
使用 .ToList()
或将其转换到新的 IEnumerable<T>
中使用 .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;
关于c# - 更新 IEnumerable 中的项目属性但该属性未保持设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9104181/