更新IEnumerable中的项目属性但该属性未保留设置?

Isa*_*son 56 c# linq

我有两个表: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;
Run Code Online (Sandbox Code Playgroud)

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

我的目标是执行您在foreach(var agent in taAgents)修补每个代理的值时所看到的数学运算,使其不为空.

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

所以,对我而言,似乎该属性并未永久设置在该对象上.更重要的是,如果我通过更新将这个新更新的对象保留回数据库,我怀疑计算的AgentCommission将在那里设置.

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

eou*_*3hf 91

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

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

  • 换句话说,你是对的 - 我想更正确的描述是`IEnumerable`并不*保证*更新其值将在枚举中持续存在. (4认同)
  • 我确实对此发疯了:)非常感谢. (3认同)