【问题标题】:Page loading to slow using datatables C# MVC使用数据表 C# MVC 页面加载速度变慢
【发布时间】:2020-10-27 14:37:29
【问题描述】:

我正在尝试清理解决方案中的一些页面。页面或表格的加载速度比我想要的要慢。我正在使用视图模型并在表格中的页面上执行 Foreach,然后使用数据表进行显示。似乎在数据库端它一次加载每条记录 1 并且有 1000 条记录需要很长时间才能加载。当我在 SQL 中运行查询时,它会立即填充。我正在寻找一些帮助来清理代码,看看这里是否有什么可以改变的,以使其加载更快。由于我在页面中使用 foreach,因此 DeferRender 不起作用。如果我使用这个或 JavaScript 对我来说并不重要,当然服务器端编码是一种选择。在控制器中,数组的使用也可能有效,但我不知道如何将它与视图模型合并。 “db.Companys.ToArray();”适用于从模型中提取,但据我所知 ToArray 不适用于 viewModel。

下面是我的代码。

控制器:

public ActionResult Index()
    {
        var data = (from temp in db.TopLvlJobs
                    join serial in db.SerialNumbers on temp.TopLvlJob equals serial.TopLvlJob
                    select new TopLvlJobsViewModels
                    {
                        PartNumber = temp.PartNumber,
                        Description = temp.Description,
                        ExtDescription = temp.ExtDescription,
                        Drawing = temp.Drawing,
                        IsDelete = false,
                        CreatedDate = DateTime.UtcNow,
                        UpgradeAvailable = temp.UpgradeAvailable,
                        TopLvlJob = temp.TopLvlJob,
                        SerialNumber = serial.SerialNumber

                    }).OrderBy(x => x.CreatedDate);

        return View(data);
    }

视图模型:

public class TopLvlJobsViewModels
{
    [Key]
    [Display(Name = "TopLvlJob")]
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string TopLvlJob { get; set; }
    [Display(Name = "Description")]
    [Required]
    public string Description { get; set; }
    [Display(Name = "Ext Description")]
    [Required]
    public string ExtDescription { get; set; }
    [Display(Name = "Part Number")]
    [Required]
    public string PartNumber { get; set; }
    [Display(Name = "Drawing")]
    [Required]
    public string Drawing { get; set; }
    [UIHint("_IsStatus")]
    [Display(Name = "Upgrade Available ?")]
    [Required]
    public bool UpgradeAvailable { get; set; }

    public DateTime? CreatedDate { get; set; }

    public string CreatedBy { get; set; }

    public DateTime? UpdatedDate { get; set; }

    public string UpdatedBy { get; set; }

    public bool? IsDelete { get; set; }
    [Display(Name = "Serial")]
    public string SerialNumber { get; set; }
    public TopLvlJobs topsjobs { get; set; }

    public HttpPostedFileBase Pdfupload { get; set; }

    public virtual IEnumerable<SubJobs> SubJobs { get; set; }
    public virtual IEnumerable<Upgrades> Upgrade { get; set; }
}

.CHTML 页面上的 JavaScript

    $(document).ready(function () {
    //var oTableMenuPermission = "";
    //oTableMenuPermission = 
    $("#SubJobsListTable").dataTable({
        "bRetrieve": true,
        "bProcessing": true,
        "dom": 'lBfrtip',
        "buttons": [
            { extend: 'copyHtml5', exportOptions: { columns: ':visible' } }
            , { extend: 'excelHtml5', exportOptions: { columns: ':visible' } }
            , { extend: 'csvHtml5', exportOptions: { columns: ':visible' } }
            , { extend: 'pdfHtml5', exportOptions: { columns: ':visible' } }
            , { extend: 'print', exportOptions: { columns: ':visible' } }
            , 'colvis'
        ], columnDefs: [{ visible: false, targets: [3] }, { orderable: false, targets: [2, 3, 4, 5, 6, 7, 8] }],
        "pageLength": 10,
        "lengthMenu": [[5, 10, 25, 50, -1], [5, 10, 25, 50, "All"]],
    });
    //table.buttons().container()
    //    .appendTo($('.col-lg-8:eq(0)', table.table().container()));
});

我可以给你任何需要的东西,由于篇幅原因我没有发布整个 CHTML 页面,但它只是表格视图中的一个基本 Foreach。

感谢您的帮助!

【问题讨论】:

  • 不清楚延迟是查询还是填充视图的时间。连接字符串使用哪个驱动程序?查询速度是服务器和传输数据时间量的函数。有些司机比其他司机快。所以我现在不知道是什么导致了这个问题。
  • @jdweng 我不确定您所说的驱动程序是什么意思。我相信这是查询或查询的方式。我使用分析器并在填充时查看。似乎是分别查询每条记录。我将在分析器填充时发布一个 sn-p。
  • 查看以下网页顶部:connectionstrings.com/sql-server
  • @jdweng 我不确定我之前在分析器中做了什么来查看我所看到的。我刚刚开始研究这个。但是,在页面完全加载之前,似乎在服务器上完成了批处理..
  • @jdweng 我现在明白你的意思了。我不知道它使用的是什么驱动程序。连接是通过实体框架实现的,我认为我无法控制它。我在连接字符串中唯一拥有的是 ProviderName="System.Data.SqlClient"。这是在 Web.config 中。

标签: javascript c# asp.net-mvc datatables


【解决方案1】:

使用 IQueryable 代替 IEnumerable 并尝试

从数据库中查询数据,IEnumerable 在服务器端执行选择查询,在客户端将数据加载到内存中,然后过滤数据。 从数据库中查询数据,IQueryable 使用所有过滤器在服务器端执行选择查询。

【讨论】:

  • 我假设您指的是 SubJobs 和升级模型。这与加载 TopLvlJobs 视图没有任何关系。我在视图中使用 IEnumerable。我读过,在视图中使用 IQueryable 不是一个好主意。老实说,我很想只使用存储过程,但我找不到一种方法让每条记录都带有表中的编辑、删除等按钮。可能是因为 MVC 的构建方式不同。我使用存储过程来保存、编辑和删除记录。它干净又快速。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多