You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MVC服务端分页优化求助:4200条数据全量加载卡顿

MVC系统Nonconforming Service数据分页失效与性能优化方案

核心问题诊断

你遇到的分页无效、加载缓慢的根本原因是:后端未实现真正的分页逻辑,即便前端启用了serverSide和processing,后端仍全量返回4200条数据,导致前端依然需要处理全量数据,分页功能形同虚设。DataTables的serverSide模式要求后端配合接收分页/筛选参数,仅返回当前页的数据,并返回符合规范的统计信息。


分步优化实现

1. 实体层:修改查询方法支持分页与筛选

调整GetAllNSIssue方法,添加分页参数和筛选逻辑,仅返回当前页数据并统计总条数:

// 实体类查询方法改造,返回分页数据+统计信息
public (List<NonconformingServiceModel> Data, int TotalCount, int FilteredCount) GetAllNSIssue(FilterModel filter, int pageIndex, int pageSize)
{
    var query = _dbContext.NonconformingServices.AsQueryable();

    // 应用筛选条件(根据FilterModel实际字段调整)
    if (!string.IsNullOrEmpty(filter.Status))
        query = query.Where(s => s.Status == filter.Status);
    if (filter.StartDate.HasValue)
        query = query.Where(s => s.CreateDate >= filter.StartDate);
    if (filter.EndDate.HasValue)
        query = query.Where(s => s.CreateDate <= filter.EndDate);

    // 统计总条数与筛选后条数
    int totalCount = query.Count();
    int filteredCount = totalCount;

    // 分页逻辑:跳过前N条,取指定条数(避免内存分页)
    var data = query.OrderByDescending(s => s.CreateDate)
                    .Skip((pageIndex - 1) * pageSize)
                    .Take(pageSize)
                    .Select(s => new NonconformingServiceModel
                    {
                        Id = s.Id,
                        ServiceCode = s.ServiceCode,
                        Status = s.Status,
                        CreateDate = s.CreateDate
                        // 仅映射前端需要的字段,避免冗余数据
                    })
                    .ToList();

    return (data, totalCount, filteredCount);
}

2. Controller:接收前端参数并返回规范JSON

新增/改造Action,接收DataTables传递的分页参数,调用分页查询后返回符合要求的JSON结构:

// 接收DataTables请求参数的辅助类
public class DataTablesRequest
{
    public int draw { get; set; }
    public int start { get; set; }
    public int length { get; set; }
}

// 改造后的Controller Action
public ActionResult LoadNSIssues(DataTablesRequest request, FilterModel filter)
{
    // 转换start参数为页码:start是跳过的条数,length是每页条数
    int pageIndex = (request.start / request.length) + 1;
    int pageSize = request.length;

    // 调用分页查询
    var result = _nsIssueService.GetAllNSIssue(filter, pageIndex, pageSize);

    // 返回DataTables要求的标准JSON格式
    var response = new
    {
        draw = request.draw,
        recordsTotal = result.TotalCount,
        recordsFiltered = result.FilteredCount,
        data = result.Data
    };

    return Json(response, JsonRequestBehavior.AllowGet);
}

3. View层:确认DataTables配置正确性

确保前端表格配置正确传递参数,并绑定到改造后的Action:

<table id="nsIssueTable" class="table table-striped">
    <thead>
        <tr>
            <th>ID</th>
            <th>服务编码</th>
            <th>状态</th>
            <th>创建日期</th>
        </tr>
    </thead>
</table>

<script>
$(document).ready(function() {
    var table = $('#nsIssueTable').DataTable({
        serverSide: true,
        processing: true,
        ajax: {
            url: '@Url.Action("LoadNSIssues", "NonconformingService")',
            type: 'POST',
            data: function(d) {
                // 传递自定义筛选参数(需与FilterModel字段对应)
                d.Status = $('#statusFilter').val();
                d.StartDate = $('#startDate').val();
                d.EndDate = $('#endDate').val();
            }
        },
        columns: [
            { data: 'Id' },
            { data: 'ServiceCode' },
            { data: 'Status' },
            { data: 'CreateDate' }
        ],
        pageLength: 10,
        lengthMenu: [10, 25, 50, 100]
    });

    // 筛选控件变化时触发表格重载
    $('#statusFilter, #startDate, #endDate').on('change', function() {
        table.draw();
    });
});
</script>

额外性能优化建议

  • 数据库索引优化:给查询中常用的筛选/排序字段(如CreateDate、Status)添加非聚集索引,降低数据库查询耗时
  • 异步处理:将Controller和实体层方法改为async/await模式,提升系统并发能力
  • 字段精简:查询时仅返回前端需要的字段,避免SELECT *带来的冗余数据传输
  • 缓存策略:针对非实时更新的数据,可对热门筛选条件下的分页结果做短期缓存,减少数据库查询次数

内容的提问来源于stack exchange,提问作者Josh Nav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:09:17