C# 实体框架-幕后:数据读取器和连接生命周期

C# 实体框架-幕后:数据读取器和连接生命周期,c#,.net,mysql,entity-framework,datareader,C#,.net,Mysql,Entity Framework,Datareader,关于环境足迹的另一个问题: 我想知道在迭代查询结果时幕后发生了什么 例如,请查看以下代码: var activeSources = from e in entitiesContext.Sources where e.IsActive select e; 然后: foreach (Source currSource in allSources) { code based on the current sourc

关于环境足迹的另一个问题:

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

例如,请查看以下代码:

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基于DataReader以获得最大效率,因此基于该假设,我认为在上述情况下,数据库连接将保持打开状态,直到我完成对结果的迭代,这将是一个非常长的时间(当以代码的形式谈论时),这显然是我不想要的

有没有一种方法可以像我使用普通的旧ADO.NET数据适配器、数据集和fill()方法而不是使用DataReaders那样获取整个数据

或者我的假设太离谱了

在任何情况下,我都希望能找到一个好的来源来解释这一点

谢谢


Mikey

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

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

var results = activeSources.ToList();

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

如果您希望提前获取所有数据,类似于
Fill()
,您需要强制执行查询

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

var results = activeSources.ToList();

调用
ToList()
后,您将获得数据并断开与数据库的连接。

如果要一次返回所有结果,请使用.ToList();那么延迟执行就不会发生

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

如果要一次返回所有结果,请使用.ToList();那么延迟执行就不会发生

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


@Jethro:我想你的意思是推迟执行。延迟加载是一个完全不同的主题,涉及相关实体的具体化。它不是延迟加载-它代表不同的功能。这叫做延迟执行。哦,是的,延迟执行,嗯,它们不是很相似吗?几乎一样?没有延迟加载和延迟执行是不一样的。延迟执行意味着您定义了查询,但一旦开始迭代查询或调用方法(如
ToList
First
),查询就会执行,等等。延迟加载意味着返回的实体是代理的,当您第一次访问未加载的导航属性时,上下文将触发对数据库的另一个查询并为您加载数据。@Ladislav Mrnka,谢谢,是的,我做了一些研究来澄清它。谢谢。@Jethro:我想你的意思是推迟执行。延迟加载是一个完全不同的主题,涉及相关实体的具体化。它不是延迟加载-它代表不同的功能。这叫做延迟执行。哦,是的,延迟执行,嗯,它们不是很相似吗?几乎一样?没有延迟加载和延迟执行是不一样的。延迟执行意味着您定义了查询,但一旦开始迭代查询或调用方法(如
ToList
First
),查询就会执行,等等。延迟加载意味着返回的实体是代理的,当您第一次访问未加载的导航属性时,上下文将触发对数据库的另一个查询并为您加载数据。@Ladislav Mrnka,谢谢,是的,我做了一些研究来澄清它。谢谢。ToList(IEnumerable)方法强制立即执行查询求值,并返回包含查询结果的列表。您可以将此方法附加到查询中,以获得查询结果的缓存副本。谢谢,非常感谢:)“ToList(IEnumerable)方法强制立即查询求值并返回包含查询结果的列表。您可以将此方法附加到查询中,以获取查询结果的缓存副本。“谢谢,非常感谢:)谢谢,我关于DataReader的假设正确吗?甚至接近这个程度?@Mikey:在这一点上我真的不确定。我记得读到EF在封面下使用LINQtoSQL,所以问题是如何实现它?我也会假设DataReader
,但无法确认。通常@Ladislav和@Slauma在这些主题上有很好的输入..EF不使用Linq to SQL-它基于ADO.NET完全独立地实现了数据访问,并且真正使用了数据读取器。这个假设是正确的。如果你在结果集中迭代,阅读器必须保持打开状态。@Ladislav:酷,我想你会知道的!谢谢,我关于数据阅读器的假设正确吗?甚至接近这个程度?@Mikey:在这一点上我真的不确定。我记得读到EF在封面下使用LINQtoSQL,所以问题是如何实现它?我也会假设DataReader
,但无法确认。通常@Ladislav和@Slauma在这些主题上有很好的输入..EF不使用Linq to SQL-它基于ADO.NET完全独立地实现了数据访问,并且真正使用了数据读取器。这个假设是正确的。如果你在结果集中迭代,阅读器必须保持打开状态。@Ladislav:酷,我想你会知道的!