实体框架 - 幕后:DataReaders和连接生命周期

时间:2011-06-30 13:13:32

标签: c# .net mysql entity-framework datareader

关于EF的另一个问题:

我想知道在迭代查询结果时幕后会发生什么。

例如,请查看以下代码:

var activeSources = from e in entitiesContext.Sources
                    where e.IsActive
                    select e;

然后:

foreach (Source currSource in allSources)
{
   code based on the current source...
}

重要提示:每次迭代都需要一段时间才能完成(从1到25秒)。

现在,我假设EF基于DataReaders以获得最大效率,因此基于该假设,我认为在上述情况下,数据库连接将保持打开,直到我完成迭代结果,这将是一个非常很长一段时间(在谈论代码时),这是我显然不想要的。

有没有办法获取整个数据,就像我用普通的旧ADO.NET DataAdapters,DataSet和fill()方法而不是使用DataReaders一样?

或者我的假设可能已经过时了?

无论如何,如果有的话,我会很乐意指出一个好的消息来源解释这个。

谢谢,

米奇

2 个答案:

答案 0 :(得分:3)

如果您想预先获取所有数据,与Fill()类似,则需要强制执行查询。

var activeSources = from e in entitiesContext.Sources
                    where e.IsActive
                    select e;

var results = activeSources.ToList();

调用ToList()后,您将拥有数据并与数据库断开连接。

答案 1 :(得分:1)

如果要立即返回所有结果,请使用.ToList();然后不会发生延迟执行。

var activeSources = (from e in entitiesContext.Sources
                where e.IsActive
                select e).ToList();