Atualizando uma propriedade de item dentro de IEnumerable, mas a propriedade não fica definida?

Eu tenho duas tabelas: Transações e TransactionAgents. TransactionAgents tem uma chave estrangeira para Transactions chamado TransactionID. Bastante padrão.

Eu também tenho esse código:

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; 

Basicamente, um TransactionAgent tem uma propriedade / coluna denominada AgentCommission, que é nula para todos os TransactionAgents no meu database.

Meu objective é executar as contas que você vê no foreach(var agent in taAgents) para consertar o valor de cada agente para que ele não seja nulo.

Estranhamente, quando executo este código e ponto de agent.AgentCommission = (formula) no agent.AgentCommission = (formula) ele mostra que o valor está sendo calculado para o AgentComissision e o object está sendo atualizado, mas depois que ele é exibido no meu datagrid (usado apenas para teste), ele não mostra o valor calculado.

Então, para mim, parece que a propriedade não está sendo definida permanentemente no object. Além do mais, se eu persistir esse object recém-atualizado de volta ao database com uma atualização, duvido que o AgentCommission calculado será definido lá.

Sem ter minha tabela configurada da mesma maneira, existe alguém que possa ver o código e ver por que não estou mantendo o valor da propriedade?

IEnumerable s não garante que os valores atualizados persistirão nas enumerações. Por exemplo, uma List retornará o mesmo conjunto de objects em cada iteração, portanto, se você atualizar uma propriedade, ela será salva entre as iterações. No entanto, muitas outras implementações de IEnumerable s retornam um novo conjunto de objects a cada vez, portanto, as alterações feitas não persistem.

Se você precisar armazenar e atualizar os resultados, puxe o IEnumerable para um List usando .ToList() ou projete-o em um novo IEnumerable usando .Select() com as alterações aplicadas.

Supondo que você esteja usando LINQ to SQL, se EnableObjectTracking for false, os objects serão construídos de novo toda vez que a consulta for executada. Caso contrário, você obteria as mesmas instâncias de objects todas as vezes e suas alterações sobreviveriam. No entanto, como outros mostraram, em vez de executar a consulta várias vezes, armazene os resultados em uma lista. Você não apenas obterá o que deseja trabalhando, mas também terá menos viagens de database.

Especificamente, o problema é que cada vez que você acessar o IEnumerable, ele enumera sobre a coleção. Nesse caso, a coleção é uma chamada para o database. Na primeira parte, você está obtendo os valores do database e atualizando-os. Na segunda parte, você está obtendo os valores do database novamente e definindo isso como a fonte de dados (ou, pedantemente, você está definindo o enumerador como a fonte de dados e, em seguida, que está recebendo os valores do database).

Use .ToList () ou similar para manter os resultados na memory e acessar a mesma coleção todas as vezes.

Eu achei que tinha que localizar o item na lista que eu queria modificar, extrair a cópia, modificar a cópia (incrementando sua propriedade de contagem), remover o original da lista e adicionar a cópia modificada. var x = stats.Where (d => d.word == s) .FirstOrDefault (); var statCount = stats.IndexOf (x); x.count ++; stats.RemoveAt (statCount); stats.Add (x);