Entity Framework запрос вне памяти исключения - PullRequest
6 голосов
/ 27 июля 2011

Я новичок в .NET Entity Framework и пытаюсь перебрать записи в таблице с несколькими миллионами строк.Вот основной код:

// select the records from the database
var records = from data in dataContext.Messages
                select data;

// iterate over the messages
foreach (var record in records)
{
    // do nothing
}

При переборе данных я получаю «исключение из памяти».Есть ли способ, которым я могу изменить свой запрос или управлять памятью экземпляра ObjectQuery?

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

Я подозреваю, что проблема в том, что Entity Framework пытается кэшировать / отслеживать все эти данные в контексте вашего объекта, что в конечном итоге вызывает исключение OutOfMemory, если набор данных огромен.

Вы можете отключить отслеживание вручнуючтобы избежать этого:

dataContext.Messages.MergeOption = System.Data.Objects.MergeOption.NoTracking;

Распределенная память, которую вы видите в данный момент, находится внутри контекста данных - эта память со временем будет собирать мусор после удаления контекста, так что в качестве альтернативы вы можете материализовать меньшие партии строк внутри.использование блока или избавиться от контекста объекта вручную, чтобы восстановить память между каждым пакетом.

0 голосов
/ 27 июля 2011

Что касается изменения вашего запроса, вы можете добавить предложение where для урезания записей, возвращающихся:

http://msdn.microsoft.com/en-us/library/bb311043.aspx

...