Entity Framework 6 или Core - чтение результатов запроса с помощью шаблона "DataReader"
Есть ли способ получить результат запроса LINQ для EF DBContext как "Типизированный читатель данных", таким образом, чтобы при чтении результата IQueryable (например, с.ToList()) я не помещал все привести в память?
Я ожидаю что-то вроде этого (или эквивалент):
var personQueryResult=dbContext.People.Where(…).Select(…).AsDataReader();
foreach(person in personQueryResult){
//Here I expect that person is typed of the People Dbset<T> type, ex. a Person type and i can do:
person.Name="...";
person.Surname="...";
//etc.
}
1 ответ
Решение
Не существует явного метода, который гарантировал бы, что коллекция будет прокручиваться через DbDataReader.
Зная иерархию наследования базовых классов EF, каждое использование foreach
на DbSet<T>,IQueryable<T>
или же IEnumerable<T>
избегая любого прямого метода, который вызовет отложенное выполнение запроса (например, ToList()
) будет препятствовать загрузке всех записей в памяти, так что при каждом "MoveNext()" перечислителя будет использоваться "Read()" базового DbDataReader
,