2011-08-24 61 views
0

我在我的ASP .NET MVC应用程序中使用Infragistics jQuery grid。我的数据源是引用SQL数据库的ADO .NET实体模型。下面是我的控制器代码来设置网格,并提供数据源为它拉离:ASP.NET MVC中的jQuery网格绑定如此缓慢

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秒),所以我做了一些调查和它的model.GetData()致电GetInstrumentListData()一直占用。根据Intellisense,这个函数首先执行数据绑定并生成JsonResult对象

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

这里是来自Firebug的请求追踪。
Request tracing

关于发生了什么的任何想法?

编辑: @allentranks的回答和@AlastairPitts评论让我意识到,它其实是我从我得到的数据源。源不是一个表,而是一个视图,它是由我的DBA从一大堆疯狂的连接创建的。事实证明,运行查询需要13+秒,所以不用担心其加载时间过长。谢谢你的帮助。

+0

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

回答

1

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

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

这应该工作:

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

而且,你也许需要创建标签列的索引来更快地执行查询。

+0

糟糕,OrderBy两次是复制和粘贴错误,实际上它只在我的代码中存在一次,现在我已在问题文章中修复了这一错误。 – link664

+0

而不是查询花费时间的查询,它是在它后面的行 - 返回model.GetData() – link664

+3

@ link664:它使用延迟加载,以便查询实际上不会被执行,直到您调用'。的GetData()'。在'.GetData()'调用.'ToList()'之前强制加载@allentranks提到。 –

0

从控制器返回的数据有问题(数据量太多,12.5kb的10条记录!)。你应该检查从萤火虫服务器返回的json数据。确保您只接收所需的并且特定于网格的数据。我会建议为网格制作自定义视图模型。

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