我正在使用.Net 4.0和SQL Server 2008 R2。
我正在运行一个大型SQL选择查询,该查询返回数百万个结果,并且需要很长时间才能完全运行。
有谁知道我如何只读取查询返回的一些结果,而不必等待整个查询完成?
换句话说,我想在查询仍运行并读取下一个结果的同时读取第一个10,000条记录块。
这部分取决于查询本身是在流传输还是在临时表中 进行 大量工作, 然后 (最终)开始返回数据。在第二种情况下,除了重新编写查询之外,您无法做其他任何事情。但是,在第一种情况下,迭代器块通常会有所帮助,即
public IEnumerable<Foo> GetData() { // not shown; building command etc using(var reader = cmd.ExecuteReader()) { while(reader.Read()) { Foo foo = // not shown; materialize Foo from reader yield return foo; } } }
现在,这是一个流式迭代器-您可以foreach对其进行处理,它将从传入的TDS数据中实时检索记录,而无需先缓冲所有数据。
foreach
如果您(也许明智地)不想编写自己的实现代码,则可以使用一些工具为您执行此操作-例如,LINQ-to-SQLExecuteQuery<T>(tsql,args)可以轻松完成上述任务。
ExecuteQuery<T>(tsql,args)