C# 在CSHTML表格中显示+100.000个条目花费了大量时间

C# 在CSHTML表格中显示+100.000个条目花费了大量时间,c#,asp.net-mvc,entity-framework,asp.net-core,razor,C#,Asp.net Mvc,Entity Framework,Asp.net Core,Razor,我一直在开发我的应用程序,该应用程序显示一个表,其中包含市场上的实际汽车条目。由于这个应用程序必须处理大量信息超过100000个条目,我在用CSHTML将它们显示到表中时遇到问题加载时间过长,可能超过10分钟 我将分享一些代码,向您展示它的实际编码方式: public partial class Car { public string CarID { get; set; } public string Brand { get; set; }

我一直在开发我的应用程序,该应用程序显示一个表,其中包含市场上的实际汽车条目。由于这个应用程序必须处理大量信息超过100000个条目,我在用CSHTML将它们显示到表中时遇到问题加载时间过长,可能超过10分钟

我将分享一些代码,向您展示它的实际编码方式:

public partial class Car
    {
        public string CarID { get; set; }
        public string Brand { get; set; }
        public string Price { get; set; }
    }
这是my Car.cs类,这是它在CSHTML表中的显示方式:

<script>
$(document).ready(function () {
    $('#carTable').DataTable(
    {
        lengthMenu: [5, 10, 25, 50],
    }
);
<script>

<table id="carTable" class="table table-striped table-responsive-sm table-bordered">
    <thead>
        <tr>
            <th>CarID <i class="fa fa-sort"></i></th>
            <th>Brand <i class="fa fa-sort"></i></th>
            <th>Price<i class="fa fa-sort"></i></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var car in Model.CarsList)
        {
        <tr>
            <td data-sortable="true">@car.CarID</td>
            <td data-sortable="true">@car.Brand</td>
            <td data-sortable="true">@car.Price</td>
        }
        </tr>
        }
    </tbody>
</table>

这就是我在控制器中将它们添加到ViewModel中的方式,它只有一个属性->IEnumerable CarsList:

public async Task<IActionResult> ShowCars(){
    CarViewModel cVM = new CarViewModel();
    var carsInMyDB = _context.Cars.ToList();
    cVM.CarsList = carsInMyDB;
    return View(cVM)
}

如前所述,必须在此表中加载超过100.000个条目,并且需要花费太多时间才能正确显示它们

我可以提出哪些建议/更改来改进我的加载时间

谢谢你的时间和回答D

可能会有帮助。
另外,如果您希望所有这些都在一个页面上,请阅读有关延迟加载的内容。

这是一个非常糟糕的解决方案:

_context.Cars.ToList();
当您只有很少的记录时,它可能会工作,但这会在内存中获取整个表,并且会占用大量服务器资源。为什么不根据页面大小使用分页和数据库过程来获取记录。在数据库上完成这项工作的速度比在代码中快得多

您可以将页码和页数限制传递给数据库存储过程,这样做会更快

如果使用SQL Server,以下是此类存储过程及其从控制器调用的示例:

CREATE PROCEDURE [dbo].[CarsSelect]
    (@limit INT,
     @page INT)
AS 
    SELECT * 
    FROM 
        (SELECT 
             ROW_NUMBER() OVER (ORDER BY pk) AS RowNum, *  
         FROM 
             Cars) AS RowConstrainedResult
    WHERE   
        RowNum >= @page * @limit 
        AND RowNum <= @page * @limit + @limit 
    ORDER BY 
        RowNum
这里返回JsonResult:

public JsonResult GetCars(int page, int limit)
{
  //Your context get cars from DB with limit and page
  List<Cars> cars = _context.CarsSelect(limit, page); 
  var carsJSON = from c in cars 
  select new {
         CarID = c.CarID,
         Brand = c.Brand 
         Price = c.Price
  };      
  return Json ( new { carsJSON }, JsonRequestBehavior.AllowGet);;
}

在您的情况下,数据正在变慢…因为您已使用foreach将数据绑定到 表..不需要使用foreach,只需使用jquery datatbles插件

 <div style="width:90%; margin:0 auto">
   <table id="myDatatable">
    <thead>
        <tr>
            <th>Room Name</th>
            <th>Room Type</th>
            <th>Room Rate</th>
        </tr>
    </thead>

</table>
您还可以通过使用Skip和Take linq使用服务器端分页来加快进程 运营商只需点击链接


分页如何?您可能需要查看:。
@section scritps{
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script src="https://cdn.datatables.net/1.10.13/js/jquery.dataTables.min.js"> 
</script>
<script src="~/Scripts/jquery-ui-1.12.1.min.js"></script>
}

<script>
$(document).ready(function () {
    var oTable = $('#myDatatable').DataTable({
        "proccessing": true,
        "searching": true,
        "info": true,
        "paging":true,
        "scrollCollapse": true,
        "autoWidth": true,
        "ajax": {
            "url": '/Admin/Rooms',
            "type": "get",
            "datatype":"json"
        },
        "columns": [
            { "data": "Room_name", "autoWidth": true },
            { "data": "RoomType", "autoWidth": true },
            { "data": "Room_rate", "autoWidth": true }
        ]

    })
})
   and this is controllers code 

    public ActionResult Rooms()
    {
        using (RoomReservationEntities db = new RoomReservationEntities())
        {
            var room_query = (from room in db.Rooms
                    join roomType in db.Room_Type
                    on room.RoomType_id equals roomType.RoomType_id
                    select new { room.Room_id, room.Room_name, roomType.RoomType, 
                                roomType.Room_rate }).ToList();

            return Json(new { data = room_query }, JsonRequestBehavior.AllowGet);
        }
    }