我有一个 sql 查询,可以通过 DataReader 带回大量行。刚才我查询数据库将结果集转换为 List(of ) 并将 Grid 数据绑定到 List。
由于数据集的大小,这有时会导致超时。
我目前有一个三级设置,其中 UI 作用于业务层中的对象列表。
谁能建议在这个场景中实现延迟加载的最佳方法?还是有其他方法可以干净地实现这一点?
我目前正在使用 Visual Studio 2005、.NET 2.0
编辑:在这种情况下如何使用分页?
LINQ to SQL 在您的情况下似乎很有意义。
否则,如果出于任何原因,您不想使用 LINQ to SQL(例如,您使用的是 .NET 2.0),请考虑编写一个迭代器来读取DataReader
并将其转换为适当的对象:
IEnumerator<MyObject> ReadDataReader() {
while(reader.MoveNext())
yield return FetchObject(reader);
}
您是否需要一次带回所有数据?你可以考虑分页。
分页可能是您最好的解决方案。如果您使用的是 SQL Server 2005 或更高版本,则添加了新功能。行号():
WITH MyThings AS
(
SELECT ThingID, DateEntered,
ROW_NUMBER() OVER (ORDER BY DateEntered) AS 'RowNumber'
FROM dbo.Things
)
SELECT *
FROM ThingDetails
WHERE RowNumber BETWEEN 50 AND 60;
David Hayden的一个例子对演示 SQL 很有帮助。
此方法将减少返回的记录数,从而减少总体加载时间。这确实意味着您将不得不做更多的事情来跟踪您在记录序列中的位置,但值得付出努力。
标准分页技术要求所有内容都从数据库返回,然后在中间层或客户端层(代码隐藏)进行过滤,此方法将记录减少到更易于管理的子集。