C# 在CSHTML表格中显示+100.000个条目花费了大量时间
我一直在开发我的应用程序,该应用程序显示一个表,其中包含市场上的实际汽车条目。由于这个应用程序必须处理大量信息超过100000个条目,我在用CSHTML将它们显示到表中时遇到问题加载时间过长,可能超过10分钟 我将分享一些代码,向您展示它的实际编码方式: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; }
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);
}
}