Действительно ли это - ленивая проблема загрузки 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, потому что я мой набор пуст!

5
задан TalkingCode 19 July 2010 в 15:24
поделиться

2 ответа

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

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

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

11
ответ дан 18 December 2019 в 09:47
поделиться

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

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

favAgents = favAgents.ToList();

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

6
ответ дан 18 December 2019 в 09:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: