Подтвердить что ты не робот

Обновление свойства элемента в IEnumerable, но свойство не остается установленным?

У меня две таблицы: транзакции и транзакционные агенты. 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 имеет свойство /column с именем AgentCommission, которое является нулевым для всех TransactionAgents в моей базе данных.

Моя цель - выполнить математику, которую вы видите в foreach(var agent in taAgents), чтобы исправить значение для каждого агента, чтобы оно не было нулевым.

Как ни странно, когда я запускаю этот код и точку прерывания на agent.AgentCommission = (formula), он показывает, что значение вычисляется для AgentCommissision, и объект обновляется, но после того, как он отображается в моем datagrid (используется только для тестирования), он не покажите значение, которое оно подсчитало.

Итак, мне кажется, что свойство не постоянно устанавливается на объект. Что еще? Если я сохраню этот обновленный объект обратно в базу данных с обновлением, я сомневаюсь, что вычисленный агент AgentCommission будет установлен там.

Без того, чтобы моя таблица настраивалась одинаково, есть ли кто-нибудь, кто может посмотреть на код и посмотреть, почему я не сохраняю значение свойства?

4b9b3361

Ответ 1

IEnumerable<T> не гарантируют, что обновленные значения будут сохраняться в перечислениях. Например, a List вернет тот же набор объектов на каждой итерации, поэтому, если вы обновите свойство, оно будет сохранено в разных итерациях. Однако многие другие реализации IEnumerable возвращают новый набор объектов каждый раз, поэтому любые сделанные изменения не будут сохраняться.

Если вам нужно сохранить и обновить результаты, потяните IEnumerable<T> вниз до List<T> с помощью .ToList() или проецируйте его в новый IEnumerable<T> с помощью .Select() с внесенными изменениями.

Ответ 2

Предполагая, что вы используете LINQ to SQL, если EnableObjectTracking является ложным, тогда объекты будут создаваться новыми каждый раз, когда выполняется запрос. В противном случае вы будете получать одинаковые экземпляры объектов каждый раз, и ваши изменения выживут. Однако, как показали другие, вместо того, чтобы запрос выполнялся несколько раз, кешируйте результаты в списке. Мало того, что вы получите то, что хотите, у вас будет меньше посещений базы данных.

Ответ 3

В частности, проблема в том, что каждый раз, когда вы обращаетесь к IEnumerable, он перечисляет коллекцию. В этом случае коллекция является вызовом базы данных. В первой части вы получаете значения из базы данных и обновляете их. Во второй части вы снова получаете значения из базы данных и устанавливаете это как источник данных (или, педантично, вы устанавливаете перечислитель как источник данных, а затем получаем значения из базы данных).

Используйте .ToList() или аналогичный, чтобы сохранить результаты в памяти и получать доступ к одной и той же коллекции каждый раз.

Ответ 4

Я обнаружил, что мне нужно найти элемент в списке, который я хотел изменить, извлечь копию, изменить копию (путем увеличения его свойства count), удалить оригинал из списка и добавить измененную копию.                   var x = stats.Where(d = > d.word == s).FirstOrDefault();                   var statCount = stats.IndexOf(x);                   x.count ++;                   stats.RemoveAt(StatCount);                   stats.Add(х);