Entity Framework - негласно: DataReaders и срок жизни соединения - PullRequest
1 голос
/ 30 июня 2011

Еще один вопрос относительно EF:

Мне было интересно, что происходит за кулисами при переборе результатов запроса.

Например, проверьте следующий код:

var activeSources = from e in entitiesContext.Sources
                    where e.IsActive
                    select e;

и затем:

foreach (Source currSource in allSources)
{
   code based on the current source...
}

Важное примечание : Каждая итерация занимает некоторое время (от 1 до 25 секунд).

Теперь я предполагаю, что EF основан на DataReaders для максимальной эффективности, поэтому, исходя из этого предположения, я полагаю, что в приведенном выше случае соединение с базой данных будет оставаться открытым, пока я не закончу перебирать результаты, что будет очень долгое время (если говорить в терминах кода), чего я явно не хочу.

Есть ли способ извлечь все данные, как если бы я использовал обычные старые ADO.NET DataAdapters, DataSets и метод fill () вместо использования DataReaders?

Или, может быть, я не прав в своих предположениях?

В любом случае мне бы очень хотелось, чтобы меня указывали на хороший источник, объясняющий это, если таковой имеется.

Спасибо

Mikey

Ответы [ 2 ]

3 голосов
/ 30 июня 2011

Если вы хотите получить все данные заранее, аналогично Fill(), вам нужно принудительно выполнить запрос.

var activeSources = from e in entitiesContext.Sources
                    where e.IsActive
                    select e;

var results = activeSources.ToList();

После вызова ToList() у вас будут данныеи быть отключенным от базы данных.

1 голос
/ 30 июня 2011

Если вы хотите вернуть все результаты сразу, используйте .ToList (); Тогда отложенное выполнение не произойдет.

var activeSources = (from e in entitiesContext.Sources
                where e.IsActive
                select e).ToList();
...