大型查询如何 return 结果回到 C#/ASP.NET MVC 4 部分

Large query how to return results back in sections C#/ASP.NET MVC 4

我有一个用 ASP.NET MVC 4 编写的应用程序。我需要 return 来自使用 oledbdatareader 访问的 table 的大结果。

我正在使用 AJAX 到 return 包含列表的 JsonResult 对象:List<TableRow>

我不明白的是,如果我在 DataReader 循环中

using (OleDbDataReader reader = command.ExecuteReader())
{
   while (reader.Read())
   {
       names.Add(Convert.ToString(reader[0]));
   }
}

有没有办法定期发送列表对象,然后创建一个新的对象来拾取并继续?

从技术上讲,服务器只能 return 对每个请求做出单一响应,因此没有办法做你想做的事(除了设置一些疯狂的套接字东西)。

我会颠覆你正在做的事情,让你的 javascript 以 1000(或任何大小)的批次请求数据集块,并让它在请求下一个块时开始渲染.

更好的是,您可以在 UI 中实施某种形式的无限滚动,以便仅在显示时及时请求下一个块,这样您就不会将不需要的数据发送到客户。

我认为您有几个实施起来相当普遍的选项。如果您有 10,000 条记录需要返回给客户端,您可以在 MVC 应用程序中管理它。如果您使用的是 Entity Framework 和 Linq,您可以将业务逻辑编写为每次用户单击下一步按钮时仅发送回 100 行。这将使到客户端的传输保持较小,甚至可以保持从 Web 服务器到 SQL 服务器的调用较小。

如果您不想让用户点击下一个按钮(即分页),而是想要无限滚动样式,那么只需做同样的事情,当用户不断滚动时,只需继续调用 Ajax 一次发回每 100 行的方法。

Web 服务器和数据库服务器不会因 10,000 条记录而阻塞;它会窒息到客户身上。即使您在 Signal R 中打开一个套接字,我想您也应该问问自己,我真的需要一次将 10,000 行全部推送给客户端吗?

想想移动设备上的 Twitter 应用程序 phone,它们会在您滚动时向您发送数据,而不是一次发送所有数据。有帮助吗?

根据您对其直接评论进行更新 SQL

这是在 SQL 中执行分页的简单版本的示例:

DECLARE @intStartRow int;
DECLARE @intEndRow int;

SET @intStartRow = (@intPage -1) * @intPageSize + 1;
SET @intEndRow = @intPage * @intPageSize;    

WITH blogs AS
    (SELECT strBlogName, 
     ROW_NUMBER() OVER(ORDER BY intID DESC) as intRow, 
     COUNT(intID) OVER() AS intTotalHits 
     FROM tblBlog)
SELECT strBlogName, intTotalHits FROM blogs
WHERE intRow BETWEEN @intStartRow AND @intEndRow

来源:http://joelabrahamsson.com/my-favorite-way-to-do-paging-with-t-sql/