在ASP-NET MVC中处理大量数据

时间:2019-06-24 19:02:21

标签: c# asp.net model-view-controller

我开始使用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对这个问题并不重要,但是如果需要,我可以包括它们。

当前,如果我尝试执行计算机,则会意外关闭...

3 个答案:

答案 0 :(得分:0)

您可以进行一些改进。

使通话异步

该操作将由于阻塞主线程而挂起。如果可能,请尝试异步执行此操作。使用基于任务的编程可以在其他线程上运行该操作。那应该会使事情变得更好,而不会明显改善。

使用分页

仅获取您需要在页面上显示的记录数。根据您拥有的代码,这应该是最好的改进。如果可能的话,最好有更多的过滤器。但是,如果只需要25条记录,则仅获得25条记录是应该的方法。 如果您可以使用EF和LINQ等现代编程技术代替传统的ADO.Net,也会有所帮助。

使用Ajax

应该使用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)