带有大型数据库的 Mvc Telerik 网格

Posted

技术标签:

【中文标题】带有大型数据库的 Mvc Telerik 网格【英文标题】:Mvc Telerik grid With large database 【发布时间】:2013-02-22 10:04:40 【问题描述】:

我在我的 mvc 项目中使用 Telerik mvc 网格,我的表有大约 100 万条记录。我的网格加载时间过长。

这是我的查询 //

  var bib = (from a in db.Bibs
                   join inf in db.InfoTypes
                   on a.InfoTypeId equals inf.Id
                   where a.Status == "A"

                   select new BibViewModel
                   
                       Id = a.Id,
                       Type = inf.Type,
                       InfoType = inf.Description,
                       Title = (from asd in db.BibContents where asd.BibId == a.Id && asd.TagNo == "245" && asd.Sfld == "a" select asd.Value).FirstOrDefault(),
                       Author = (from asd in db.BibContents where asd.BibId == a.Id && asd.TagNo == "100" && asd.Sfld == "a" select asd.Value).FirstOrDefault(),
                       CatalogueDate = a.CatalogDate,
                       Contents = "",
                       CreatedOn = a.CreatedOn,
                       ItemRelation = db.Items.Any(item => item.BibId == a.Id),
                       IssueRelation = db.Issues.Any(item => item.BibId == a.Id),

                   );


        return View(new GridModel(bib.OrderByDescending(x => x.CreatedOn).Tolist()));

【问题讨论】:

您有大量的连接和嵌套搜索。我注意到的一件事是,您将 Status 存储为字符串数据类型,这比使用 int 要求更高。如果您删除 where 子句 'where a.Status == "A"' 并使用 'take 10000' 取 10000 行,它的执行速度会更快吗?只是一个可能会引导您找到解决方案的建议。 实际上我的查询并没有花费太多时间..我的返回查询花费了很多时间来返回 bcoj 我正在使用 Tolist..如果我删除 tolist 然后我有其他错误“比如超时服务器错误” 【参考方案1】:

ToList() 实际上调用了查询,所以如果调用ToList() 花费的时间太长,则说明问题出在查询上。

在 LINQ 中,您可以像 the following post 那样使用分页;思路是使用 Skip 和 Take 来跳过 X 条记录,只取 Y 条记录,如:

var results = (from .. select ..).Skip(X).Take(Y)

对于 1M 条记录,我强烈建议将其替换为存储过程,这对于您尝试执行的操作会快得多。考虑一种自定义分页方法,它非常适合我处理大型结果集:

http://www.neiland.net/blog/article/dynamic-paging-in-sql-server-stored-procedures/ http://www.beansoftware.com/ASP.NET-Tutorials/Paging-Stored-Procedures.aspx http://www.sqlpointers.com/2009/10/custom-sorting-and-paging-in-sql-server.html T-SQL stored procedure with sorting and paging enabled not working properly

如果您不能使用存储过程,阅读本文将有助于了解分页需要完成的工作。使用 LINQ,您将需要检查正在生成的 SQL,以了解您还可以使用 SQL 分析器或 LINQPad 微调查询的位置。

【讨论】:

acc。对于客户,我们不能在我们的项目中使用 sp 哇,这不好。但是,您可以像这样在 LINQ 中实现相同的功能:blog.kurtschindler.net/post/paging-through-lists-with-linq。如果您只获取当时需要的记录,您将获得更好的性能。我在上面编辑了我的回复。

以上是关于带有大型数据库的 Mvc Telerik 网格的主要内容,如果未能解决你的问题,请参考以下文章

在编辑期间设置 Telerik MVC 网格列属性

如何在 Matplotlib 中使用带有大型数组的网格网格?

Telerik mvc 网格选项卡顺序问题

如何使用数据注释中的远程属性验证 Telerik mvc 网格?

Telerik MVC Grid:如何在列中使用 DropDownList?

Telerik MVC 网格分页错误