【问题标题】:Linq to SQL. How to read results by row and without putting all records into memoryLINQ转SQL。如何按行读取结果而不将所有记录放入内存
【发布时间】:2018-01-12 16:24:43
【问题描述】:

是否可以逐行读取 Linq to SQL 结果,而不将整个结果存入内存?类似OleDB DbDataReader.Read()

【问题讨论】:

  • 到目前为止你有没有尝试过?
  • @AmrElgarhy,是的,我做到了,并得到了 OutOfMemoryException
  • 请把代码贴出来。

标签: c# .net sql-server linq linq-to-sql


【解决方案1】:

是的。默认情况下,LINQ 会延迟其执行。即,仅在进行枚举时从源中读取项目。如果您直接使用foreach(没有先调用.ToArray().ToList()),则结果集不会作为一个整体存储在内存中。

但是,由于对象跟踪存储正在加载的每个对象的信息,因此对于非常大的结果集,您仍然可能会出现内存溢出。为避免这种情况,请设置context.ObjectTrackingEnabled = false;。作为副作用,您还会注意到性能提升。

【讨论】:

  • 那么你能解释一下为什么这段代码会生成 OutOfMemoryException(表有超过 70 亿行)foreach (var pay in db.Pays/*.Where(p => true)*/) { int id = pay.ClientID; }
  • 尝试在上下文中设置.ObjectTrackingEnabled = false,否则将为每个项目存储跟踪信息。这也将加快执行速度。
【解决方案2】:

是的,这就是 LinQ 中 Deferred execution 的目标。使用实体框架,您可以使用 linQ 和 IQueryable 进行查询。

【讨论】:

  • 我无法使用 EF,项目使用 Linq to SQL。因此,当我遍历 IQueryable 结果时,我得到了 OutOfMemoryException
猜你喜欢
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2014-04-04
相关资源
最近更新 更多