【发布时间】:2010-10-21 18:51:30
【问题描述】:
我使用 Linq-to-SQL 已经有一段时间了,效果很好。但是,最近我一直在尝试使用它来提取大量数据并且遇到了一些问题。 (当然,我知道 L2S 可能不是这种特殊处理的正确工具,但这就是我尝试的原因 - 以找到它的限制。)
这是一个代码示例:
var buf = new StringBuilder();
var dc = new DataContext(AppSettings.ConnectionString);
var records = from a in dc.GetTable<MyReallyBigTable>() where a.State == "OH" select a;
var i = 0;
foreach (var record in records) {
buf.AppendLine(record.ID.ToString());
i += 1;
if (i > 3) {
break; // Takes forever...
}
}
一旦我开始遍历数据,查询就会按预期执行。单步执行代码时,我立即进入循环,这正是我所希望的——这意味着 L2S 似乎在幕后使用 DataReader,而不是先提取所有数据。但是,一旦我到达break,查询将继续运行并提取所有其余记录。以下是我对 SO 社区的问题:
1.) 有没有办法阻止 Linq-to-SQL 在中间完成一个非常大的查询的执行,就像使用 DataReader 一样?
2.) 如果您执行大型 Linq-to-SQL 查询,有没有办法防止 DataContext 填充每个返回的对象的更改跟踪信息。基本上,我可以像使用 DataReader 技术那样使用较短的对象生命周期进行大型查询,而不是填满内存吗?
如果这不是DataContext 本身的内置功能并且需要通过一些自定义来扩展功能,我可以。我只是想利用 Linq 的简单性和强大功能来处理夜间处理任务的大型查询,而不是依赖 T-SQL 处理所有事情。
【问题讨论】:
标签: c# linq-to-sql