大型查询如何在 C#/ASP.NET MVC 4 部分中返回结果
Posted
技术标签:
【中文标题】大型查询如何在 C#/ASP.NET MVC 4 部分中返回结果【英文标题】:Large query how to return results back in sections C#/ASP.NET MVC 4 【发布时间】:2017-08-13 15:16:15 【问题描述】:我有一个用 ASP.NET MVC 4 编写的应用程序。我需要从使用 oledbdatareader 访问的表中返回大型结果。
我正在使用 AJAX 返回一个包含 List 的 JsonResult 对象:List<TableRow>
我不明白的是,如果我在 DataReader 循环中
using (OleDbDataReader reader = command.ExecuteReader())
while (reader.Read())
names.Add(Convert.ToString(reader[0]));
有没有办法定期发送列表对象,然后创建一个新对象来拾取并继续?
【问题讨论】:
显示数据有什么要求?您是否有理由无法使用具有分页功能的表格(网格),以便用户可以将返回的数据量调整为 10、25、50 或 100 行,然后单击箭头来回翻页? 我可以使用网格,但问题是,我正在寻找一种方法以数据包的形式发送数据,而不是一次填充数据结构然后将其传递给客户端。以前没有真正做过,所以我想看看 Web 应用程序的正常过程是什么,但我可能只是依靠 SignalR 并试一试.. 【参考方案1】:从技术上讲,服务器只能对每个请求返回一个响应,所以没有办法做你想做的事(没有设置一些疯狂的套接字)。
我会颠覆你正在做的事情,让你的 javascript 请求数据集的 1000 个块(或任何大小),并让它在请求下一个块时开始渲染。
更好的是,您可以在 UI 中实现某种形式的无限滚动,以便只及时请求下一个块以使其显示,这样您就不会向客户端发送不需要的数据。
【讨论】:
至于疯狂的套接字东西,也许我可以使用“SignalR”来处理,但是,我宁愿不依赖它,而是找到一个替代方案。因此,对于批量数据集请求,这更难,因为表不是索引(也许我可以要求完成)但我不知道如何沟通在哪里停止和开始每个新查询(如果我理解正确的话)最终我想阻止数据结构变得太大。如果我能得到每一行的 id。我可能会那样做范围。【参考方案2】:我认为您有一些实施起来相当普遍的选项。如果您有 10,000 条记录需要返回给客户端,则可以在 MVC 应用程序中进行管理。如果您使用的是 Entity Framework 和 Linq,您可以编写您的业务逻辑,以便在每次用户单击下一步按钮时发送回 100 行。这将减少到客户端的传输,甚至减少从 Web 服务器到 SQL 服务器的调用。
如果您不想让用户单击下一个按钮(即分页)但想要无限滚动样式,那么只需做同样的事情,当用户不断滚动时,只需继续调用 Ajax 方法即可一次发回每 100 行。
Web 服务器和数据库服务器不会因为 10,000 条记录而窒息;它会窒息到客户端。即使您在 Signal R 中打开一个套接字,我想您也应该问问自己,我真的需要一次将 10,000 行全部推送到客户端吗?
想想手机上的 Twitter 应用程序,它们会在您滚动时向您发送数据,而不是一次性发送所有数据。这有帮助吗?
根据您对其直接 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/
【讨论】:
感谢您的反馈!我没有使用实体框架,我使用的是 OleDbConnection。用户:arychj,提到了关于无限滚动的同样的事情。因为我使用的是 OleDbConnection,所以我对这一切的工作原理感到困惑。如果可以使用 OleDbConnection,您是否有一个简单的示例可以提供。 @eaglei22 - 你在调用存储过程吗? 没有存储过程,只是一个带有预处理语句的标准 sql 字符串。 @eaglei22 - 你必须做一些事情来分页数据,所以由于你使用的是直接的 SQL,你需要添加一些业务逻辑,你可以实现上面的例子。以上是关于大型查询如何在 C#/ASP.NET MVC 4 部分中返回结果的主要内容,如果未能解决你的问题,请参考以下文章