我开始使用ASP-NET MVC编写一个针对Angular的前端应用程序和SQL Sever数据库应用程序。在某些情况下,我的查询比我必须使用的复杂,并且由于业务限制,我无法进行修改。我使用的结构与此类似:using simple queries in ASP.NET MVC,但我不知道哪种方法是处理大量数据并在前端显示的正确方法。
我有一个带有结果查询的数据结构的ViewModel,一个查询所在的DomainModel以及一个与前端进行通信的Controller。
我的问题是我不知道哪种方法可以发展我正在尝试的东西。现在,我正在尝试在列表对象中创建与查询中的行一样多的对象,但是当此方法运行时,我的计算机被阻塞而没有显示错误(我可以猜测是因为它正在使用整个内存)。 / p>
请注意,最前面的表每页仅显示25个结果,也许当用户选择表的不同页面时,我总是可以执行查询,从而获得不同的结果。我还没有尝试过这个选择。
这是DomainModel的一部分:
public IEnumerable<OperationView> GetOperations()
{
List<OperationView> Operationslist = new List<OperationView>();
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand("", connection))
{
command.CommandText = /*Query joining 8-10 tables*/;
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
var OperationView = new OperationView();
OperationView.IdOperacion = reader["ID_OPERACION"].ToString();
//Loading here some other variables of OperationView
Operationslist.Add(OperationView);
}
connection.Close();
}
return Operationslist;
}
这是控制器的一部分:
public IEnumerable<OperationView> GetOperaciones()
{
var Operation = new OperationPDomainModel();
return Operation.GetOperations();
}
我认为我的front和ViewModel对这个问题并不重要,但是如果需要,我可以包括它们。
当前,如果我尝试执行计算机,则会意外关闭...
答案 0 :(得分:0)
您可以进行一些改进。
该操作将由于阻塞主线程而挂起。如果可能,请尝试异步执行此操作。使用基于任务的编程可以在其他线程上运行该操作。那应该会使事情变得更好,而不会明显改善。
仅获取您需要在页面上显示的记录数。根据您拥有的代码,这应该是最好的改进。如果可能的话,最好有更多的过滤器。但是,如果只需要25条记录,则仅获得25条记录是应该的方法。 如果您可以使用EF和LINQ等现代编程技术代替传统的ADO.Net,也会有所帮助。
应该使用AJAX调用来完成这么大的处理。如果您不希望用户等待数据加载,则可以加载页面并使数据检索成为单独的AJAX调用的一部分。
答案 1 :(得分:0)
由于系统内存不足,因此需要分页。
此分页应在数据库端进行。 UI只需要传递页面索引和每页显示的记录数。
因此您的查询应如下所示
从foo中选择a,b,c,ROW_NUMBER()OVER(ORDER BY a)rnum 其中rnum在(25 * Page_Index)+ 1和(25 * Page_Index)+ 25之间
答案 2 :(得分:0)