Установка предложения where в запросе LINQ в цикле всегда выполняется последним предложением where, которое было установлено

Итак, у меня есть куча UltraTreeNodes. Я пытаюсь перебрать их и назначить LINQ-запрос свойству Tag, который будет выполнен позже, когда пользователь щелкнет узел. Единственное, что изменяется в запросе для каждого узла, - это переменная в предложении where. Однако при щелчке по узлу и окончательном выполнении запроса из тега он всегда использует запрос (и его переменную), который был назначен последним в цикле foreach.

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

ОБНОВЛЕНИЕ. Извините, вот код:

var query = from result in results
                    where result.SchedulingStatus != SchedulerRunStatus.Scheduled 
                    group result by result.UserId into users
                    select new {users.Key, Count = users.Count()};


        foreach (var user in query)
        {
            UltraTreeNode efdUserNode = new UltraTreeNode();
            efdUserNode.Text = user.Key + " (" + user.Count + ")";
            efdUserNode.Key = user.Key;
            IEnumerable<DownloadResultSummary> nodeQuery = from result in efdDetail.DownloadResultSummaries
                              where
                                  result.SchedulingStatus != SchedulerRunStatus.Scheduled &
                                  result.UserId == user.Key
                              select result;

            efdUserNode.Tag = nodeQuery;

            efdUserNode.Override.NodeAppearance.Image = Properties.Resources.user;
            this.efdNode.Nodes.Add(efdUserNode);
        }

person lintmouse    schedule 19.04.2012    source источник
comment
Не могли бы вы опубликовать код?   -  person Maess    schedule 19.04.2012


Ответы (1)


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

Вы , скорее всего, закрываете переменную цикла - так как ваш запрос выполняется только позже, он примет значение переменной в то время - которое назначено последним .

Вместо этого сделайте локальную копию переменной цикла внутри цикла foreach:

foreach (var user in query)
{
   User localUser = user;
   //use localUser now instead
   //..
}

Часть, где вы закрываете переменную цикла, находится здесь:

   where result.SchedulingStatus != SchedulerRunStatus.Scheduled 
         && result.UserId == user.Key
        select result;

замените это на:

   where result.SchedulingStatus != SchedulerRunStatus.Scheduled 
         && result.UserId == localUser.Key
        select result;

Подробнее см. " Закрытие переменной цикла считается вредным "

person BrokenGlass    schedule 19.04.2012
comment
Спасибо за ответ. Я должен был быть более ясным, но на самом деле я повторяю что-то еще и создаю новый UltraTreeNode на каждой итерации. - person lintmouse; 19.04.2012
comment
Милая, спасибо! Извините за ужасную неэффективность моей способности публиковать вопросы на Stackoverflow. - person lintmouse; 20.04.2012