Mvc Telerik Grid С большой базой данных
Я использую Telerik MVC Grid в моем проекте MVC, моя таблица имеет около 1 миллиона записей. Моя сетка слишком долго загружается.
Это мой запрос //
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()));
1 ответ
ToList()
на самом деле вызывает запрос, поэтому если вызов ToList()
занимает слишком много времени, это означает, что проблема связана с запросом.
В LINQ вы можете использовать пейджинг, как в следующем посте; идея состоит в том, чтобы использовать 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 с включенной сортировкой и подкачкой не работает должным образом
Если вы не можете использовать хранимые процедуры, прочтение этого поможет понять, что нужно сделать с нумерацией страниц. С LINQ вы захотите изучить генерируемый SQL, чтобы увидеть, где вы также можете точно настроить запрос, используя SQL profiler или LINQPad.