一尘不染

更新IEnumerable中的item属性,但该属性未保持设置状态吗?

c#

我有两个表: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。

奇怪的是,当我运行此代码并在agent.AgentCommission = (formula)其上出现断点时,显示正在为AgentCommissision计算值,并且正在更新对象,但是在我的数据网格中显示了该值(仅用于测试)后,它不显示计算出的值。

因此,对我而言,似乎该属性并未永久设置在该对象上。此外,如果我通过更新将这个新更新的对象持久化到数据库中,我怀疑计算出的AgentCommission是否会在那里设置。

在没有以相同方式设置表的情况下,是否有人可以查看代码并了解为什么我不保留该属性的值?


阅读 266

收藏
2020-05-19

共1个答案

一尘不染

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

如果您需要存储和更新结果,请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;
2020-05-19