【问题标题】:jQuery Grid Binding in ASP .NET MVC is so slow [closed]ASP .NET MVC 中的 jQuery Grid Binding 太慢了[关闭]
【发布时间】:2011-08-24 01:58:45
【问题描述】:

我在我的 ASP .NET MVC 应用程序中使用Infragistics jQuery grid。我的数据源是一个引用 SQL 数据库的 ADO .NET 实体模型。这是我的控制器中用于设置网格并为其提供数据源以从中提取的代码:

public ActionResult Index()
{
   var model = new GridModel();
   model.DataSourceUrl = Url.Action("GetInstrumentListData");
   this.InitializeGridOptions(model);
   return View(model);
}

public JsonResult GetInstrumentListData()
{
   var model = new GridModel();
   this.InitializeGridOptions(model);
   model.DataSource = _db.InstrumentLists.OrderBy(x => x.Tag).AsQueryable<InstrumentList>();
   return model.GetData();
}

private void InitializeGridOptions(GridModel model)
{
   Code to create columns...

   model.DefaultColumnWidth = "100px";
   model.Width = "100%";
   model.Height = "700px";

   model.Features.Add(new GridFiltering());

   var sort = new GridSorting();
   sort.Mode = SortingMode.Multiple;
   model.Features.Add(sort);

   var paging = new GridPaging();
   paging.PageSize = 30;
   model.Features.Add(paging);

   var selection = new GridSelection();
   selection.Mode = SelectionMode.Row;
   selection.MultipleSelection = true;
   model.Features.Add(selection);
}

网格需要很长时间才能显示(25-40 秒),所以我做了一些调查,GetInstrumentListData() 中的 model.GetData() 调用一直在占用时间。根据 Intellisense,此函数首先执行数据绑定并生成 JsonResult 对象

我想可能是因为我试图显示总共 1000 条记录(即使启用了分页并且每个视图只显示 30 条),可能需要一段时间才能将这些记录转换为 JSON,所以我减少了数量记录数增加到 10(从 1.2mb 的 JSON 数据到 12.5kb)。时间上没有区别。

这是来自 Firebug 的请求跟踪。

对正在发生的事情有什么想法吗?

编辑: @allentranks 的回答和 @AlastairPitts 的评论让我意识到它实际上是我从中获取数据的来源。源不是一个表,而是一个视图,它是由我的 DBA 从一大堆疯狂的连接中创建的。事实证明,运行查询需要 13 多秒,因此加载需要这么长时间也就不足为奇了。感谢您的帮助。

【问题讨论】:

  • InstrumentList 表有多少行? Tag 列上有索引吗?该查询表明您正在从该表中提取所有行

标签: jquery asp.net-mvc data-binding infragistics


【解决方案1】:

我不确定为什么您的 InstrumentLists 需要在您的查询中订购两次。

_db.InstrumentLists.OrderBy(x => x.Tag).AsQueryable<InstrumentList>().OrderBy(x => x.Tag);

这应该可行:

_db.InstrumentLists.OrderBy(x => x.Tag).ToList();

而且,您可能需要在 Tag 列上创建索引以更快地执行查询。

【讨论】:

  • 糟糕,OrderBy 两次是复制和粘贴错误,它实际上只在我的代码中出现过一次,我现在已经在问题帖子中修复了。
  • 而不是查询花费时间的查询,它是它后面的行 - return model.GetData()
  • @link664:它使用延迟加载,因此在您调用.GetData() 之前,查询实际上不会被执行。如@allentranks 所述,在.GetData() 调用.ToList() 之前强制加载。
  • 查看编辑 - 它是数据源。感谢您引导我找到答案。
【解决方案2】:

您从控制器返回的数据有问题(数据量太多。10 条记录需要 12.5kb!)。您应该在 firebug 中检查从服务器返回的 json 数据。确保您只接收所需的和特定于网格的数据。我建议为网格制作一个自定义视图模型。

作为旁注,我想分享一个每页有 50 条记录和 11 列的网格,我收到的 json 数据是 1.9 kb 和它的 967 字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多