2010-07-19 2 views
5

Что-то очень странное происходит в моей программе:Является ли это проблемой ленивой загрузки LINQ?

Я делаю этот запрос 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, потому что у меня моя коллекция пуста!

+0

Какова связь между двумя запросами и почему она должна возвращать значение. Вы фильтруете свойство 'tempResultCount' во втором запросе, изменяя свойство' DefaultNr' в первом запросе. Вы говорите о LINQ to Objects (LINQ over in-memory collection) или какой-то инструмент O/RM (например, LINQ to SQL)? – Steven

+0

Вы уверены, что это пустая коллекция, а не только, что ничто не соответствует критериям вашего второго запроса? – Paolo

ответ

11

Это не ленивая загрузка, это отсроченное исполнение. Когда вы определяете свой начальный перечислимый, вы определяете запрос, а не . Вы правы, что он выполняет просьбу; каждый раз, когда вы перебираете favAgents, он выполнит указанный вами запрос. Если вы хотите создать список на основе этого запроса, который не изменится, добавьте ToList().

var favAgents = 
    (from agt in builtAgents where agt.DefaultNr == 1 select agt).ToList(); 

Выполнение этого будет создавать список в памяти и кэшировать результаты запроса в этот момент времени.

+0

Спасибо. Я узнал что-то новое сегодня. – TalkingCode

6

Да, ваша коллекция favAgents будет пуста - вы «отключили» бит в каждом его элементе, что сделало его соответствующим запросу! Если вы дважды повторяете favAgents, он выполнит запрос дважды. favAgents представляет собой запрос, не результатов.

Если вы хотите сохранить один конкретный набор результатов, используйте ToList или что-то подобное:

favAgents = favAgents.ToList(); 

Это будет материализовать запрос - выполнить его один раз, а затем запоминать результаты в списке, в основном. ToArray будет иметь тот же эффект, но вместо этого сохраните результаты в массиве.

Смежные вопросы