Что-то очень странное происходит в моей программе:
Я делаю этот запрос agt. DefaultNr == 1 на наборе и получают 3 объекта как Результат:
IEnumerable<Agent> favAgents =
from agt in builtAgents where agt.DefaultNr == 1 select agt;
Для каждого объекта я установил DefaultNr = 0
foreach (Agent noFavAgt in favAgents)
{
noFavAgt.DefaultNr = 0;
}
Я делаю другой запрос, но по некоторым причинам мой favAgents набор пуст теперь!
IEnumerable<Agent> smallAgents = (from agt in favAgents
where agt.tempResultCount < 30
orderby agt.tempResultCount descending
select agt);
Что продолжается здесь?
Действительно ли это - ленивая проблема загрузки LINQ?
Похож будет некоторый перезапрос после того, как я установил все объекты = 0, потому что я мой набор пуст!
Это не ленивая загрузка , это отложенное выполнение . Когда вы определяете свое начальное перечислимое, вы определяете запрос , а не коллекцию . Вы правы, что он выполняет запрос; каждый раз, когда вы перебираете favAgents
, он будет выполнять заданный вами запрос. Если вы хотите создать список на основе этого запроса, который не меняется, добавьте ToList ()
.
var favAgents =
(from agt in builtAgents where agt.DefaultNr == 1 select agt).ToList();
Это создаст список в памяти и кэширует результаты запроса в этот момент времени.
Да, ваша коллекция favAgents
теперь будет пустой - вы «отключили» бит в каждом ее элементе, который заставлял ее соответствовать запросу! Если вы дважды перебираете favAgents
, запрос будет выполнен дважды. favAgents
представляет сам запрос, не результаты.
Если вы хотите сохранить один конкретный набор результатов, используйте ToList
или что-то подобное:
favAgents = favAgents.ToList();
Это материализует запрос - выполните его один раз, а затем запомните результаты в список, в основном. ToArray
будет иметь тот же эффект, но вместо этого сохранит результаты в массиве.