Я хотел бы иметь возможность перебирать каждую строку в таблице сущностей, не удерживая каждую строку в памяти. Это операция только для чтения, и каждая строка может быть удалена после обработки.
Если есть способ отбросить строку после обработки, это было бы хорошо. Я знаю, что этого можно добиться с помощью DataReader (который выходит за рамки EF), но можно ли этого добиться в EF?
Или есть способ получить DataReader из EF без прямого использования SQL?
Более подробный пример:
Используя EF, я могу кодировать:
foreach (Quote in context.Quotes)
sw.WriteLine(sw.QuoteId.ToString()+","+sw.Quotation);
но для достижения того же результата с DataReader мне нужно закодировать:
// get the connection to the database
SqlConnection connection = context.Database.Connection as SqlConnection;
// open a new connection to the database
connection.Open();
// get a DataReader for our table
SqlCommand command = new SqlCommand(context.Quotes.ToString(), connection);
SqlDataReader dr = command.ExecuteReader();
// get a recipient for our database fields
object[] L = new object[dr.FieldCount];
while (dr.Read())
{
dr.GetValues(L);
sw.WriteLine(((int)L[0]).ToString() + "," + (string)L[1]);
}
Разница заключается в том, что первому не хватает памяти (поскольку он загружает всю таблицу в память клиента), а второму выполняется до завершения (и выполняется намного быстрее), поскольку в каждый момент времени сохраняется только одна строка в памяти.
Но что не менее важно, в последнем примере отсутствует строгая типизация EF, и в случае изменения базы данных могут возникнуть ошибки.
Отсюда мой вопрос: можем ли мы получить аналогичный результат со строго типизированными строками, возвращающимися в EF?