0

我在我的 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()));
4

1 回答 1

0

ToList()实际上调用了查询,所以如果调用ToList()时间过长,这意味着问题出在查询上。

在 LINQ 中,您可以像下面的帖子一样使用分页;这个想法是使用 Skip 和 Take 来跳过 X 条记录,并且只获取 Y 条记录,如:

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

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

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

于 2013-02-22T13:01:59.887 回答