【问题标题】:Entity Framework - behind the scenes: DataReaders and connection life period实体框架 - 幕后:DataReaders 和连接生命周期
【发布时间】:2011-06-30 13:13:32
【问题描述】:

关于 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 那样获取整个数据?

或者我的假设可能与我的假设相去甚远?

在任何情况下,我都希望能找到一个很好的来源来解释这一点(如果有的话)。

谢谢,

米奇

【问题讨论】:

  • "ToList(IEnumerable) 方法强制立即查询评估并返回包含查询结果的 List。您可以将此方法附加到查询中以获得查询结果的缓存副本。”
  • 谢谢,不胜感激:)

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


【解决方案1】:

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

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

var results = activeSources.ToList();

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

【讨论】:

  • 谢谢,我对 DataReaders 的假设是否正确?甚至接近那个?
  • @Mikey:在这一点上我实际上并不确定。我记得读过 EF 在幕后使用 LINQ-to-SQL,所以问题是它是如何实现的?我也会假设DataReader,但无法确认。通常@Ladislav 和@Slauma 对这些主题有很好的意见..
  • EF 不使用 Linq-to-SQL - 它具有基于 ADO.NET 的完全独立的数据访问实现,并且它真正使用数据读取器。假设是正确的。如果您遍历结果集,阅读器必须保持打开状态。
  • @Ladislav:酷,我想你会知道的!
【解决方案2】:

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

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

【讨论】:

  • @Jethro:我想你的意思是延迟执行。延迟加载完全是一个不同的主题,涉及到相关实体何时实现。
  • 这不是延迟加载——它代表不同的功能。这称为延迟执行。
  • 哦,是的,延迟执行,嗯,它们不是很相似吗?几乎一样?
  • 无延迟加载和延迟执行是不一样的。延迟执行意味着您定义了查询,但是一旦您开始迭代查询或调用ToListFirst 等方法,就会执行查询。延迟加载意味着返回的实体被代理,并且当您访问未加载的导航属性时第一次上下文将触发另一个数据库查询并为您加载数据。
  • @Ladislav Mrnka,谢谢,是的,我对此进行了一些研究以清除它。不过还是谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
相关资源
最近更新 更多