我希望能够遍历实体表中的每一行,而无需将每一行都保存在内存中。这是一个只读操作,每一行在处理后都可以丢弃。
如果有办法在处理后丢弃该行,那很好。我知道这可以使用 DataReader 来实现(不在 EF 的范围内),但是可以在 EF 中实现吗?
或者有没有办法在不直接使用 SQL 的情况下从 EF 中获取 DataReader?
更详细的例子:
使用 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 中返回强类型行时得到类似的结果?