Mi piacerebbe essere in grado di scorrere tutte le righe in una tabella delle entità senza tenere tutte le righe in memoria. Questa è un'operazione di sola lettura e ogni riga può essere scartata dopo essere stata elaborata.
Se esiste un modo per scartare la riga dopo l'elaborazione, ciò andrebbe bene. So che questo può essere ottenuto utilizzando un DataReader (che è al di fuori dell'ambito di EF), ma può essere raggiunto all'interno di EF?
O c'è un modo per ottenere un DataReader dall'interno di EF senza utilizzare direttamente SQL?
Esempio più dettagliato:
Utilizzando EF I posso codificare:
foreach (Quote in context.Quotes)
sw.WriteLine(sw.QuoteId.ToString()+","+sw.Quotation);
ma per ottenere lo stesso risultato con un DataReader devo codificare:
// 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]);
}
La differenza è che il primo esaurisce la memoria (perché sta trascinando l'intera tabella nella memoria del client) e la successiva esegue il completamento (ed è molto più veloce) perché conserva solo una singola riga in memoria in qualsiasi momento.
Altrettanto importante è che l'ultimo esempio perde la Strong Typing di EF e se il database cambia, si possono introdurre errori.
Quindi, la mia domanda: possiamo ottenere un risultato simile con righe fortemente tipizzate che ritornano in EF?
Sulla base del tuo ultimo commento, sono ancora confuso. Dai un'occhiata a entrambi i seguenti codici.
using (var ctx = new AppContext())
{
foreach (var order in ctx.Orders)
{
Console.WriteLine(order.Date);
}
}
var constr = ConfigurationManager.ConnectionStrings["AppContext"].ConnectionString;
using (var con = new SqlConnection(constr))
{
con.Open();
var cmd = new SqlCommand("select * from dbo.Orders", con);
var reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader["Date"]);
}
}
Anche se EF ha poche query iniziali, entrambi eseguono query simili che possono essere viste dal profiler ..